이번 포스팅은 저번 포스팅에 이어서 MyBatis를 사용해서 RESTful API를 만들어보겠습니다.
2023.09.21 - [Study] - [Spring boot]MariaDB Sample Database로 RESTful API 만들기
[Spring boot]MariaDB Sample Database로 RESTful API 만들기
준비물 : Spring boot , Post man https://www.mariadbtutorial.com/getting-started/mariadb-sample-database/ MariaDB Sample Database In this tutorial, you will learn about a MariaDB sample database nation and how to load the sample database into the MariaDB
jisaydeveloper.tistory.com
포스팅에 들어가기 이전 MyBatis에서 간단히 설명하고 시작하겠습니다.
MyBatis
마이바티스(MyBatis)는 자바 퍼시스턴스 프레임워크의 하나로 XML 서술자나 애너테이션(annotation)을 사용하여 저장 프로시저나 SQL 문으로 객체들을 연결시킨다.
마이바티스는 아파치 라이선스 2.0으로 배포되는 자유 소프트웨어이다.
마이바티스는 IBATIS 3.0의 포크이며 IBATIS의 원 개발자들이 포함된 팀에 의해 유지보수되고 있다.
출처 : 위키백과
MyBatis 특징
- 쉬운 접근성과 코드의 간결함
- JDBC의 모든 기능을 MyBatis 가 대부분 제공하며 복잡한 JDBC 코드를 걷어내며 깔끔한 소스코드를 유지할 수 있다.
- 수동적인 파라미터 설정과 쿼리 결과에 대한 맵핑 구문을 제거할 수 있다.
- SQL에 변경이 있을 때마다 자바 코드를 수정하거나 컴파일 하지 않아도 된다.
- 다양한 프로그래밍 언어로 구현가능
ex. Java, C#, .NET, Ruby 등
이제 Spring Boot에 MyBatis 연동하는 법을 알아보겠습니다.
※ mapper 만드는 방식이 Annotation과 XML방식이 있는데 두가지 다 포스팅 하겠습니다.
전에 프로젝트 설정에서 Dependency에 MyBatis를 추가해줍니다.
프로젝트 설정
- Java : 11
- Spring boot version : 2.7.15
- Type : Groovy
- Dependency : Spring Web, Lombok, MariaDB Driver, Mybatis Framework
grdle에 따로 추가한다면
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.1'
이 코드를 추가하면 됩니다.
application.properties
spring.datasource.url=jdbc:mariadb://localhost:3306/nation
spring.datasource.username=your id
spring.datasource.password=your password
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
mybatis.type-aliases-package=com.example.ackmybatis.entity
mybatis.mapper-locations=classpath:mapper/*.xml
xml 방식은 mapper 경로를 설정해야지만 오류없이 실행가능합니다.
Entity
public class Languages {
private Integer languageId;
private String language;
}
Mapper - Annotation
@Mapper
public interface LanguagesMapper {
@Select("SELECT language_id AS languageId, language FROM Languages")
List<Languages> findAll();
@Select("SELECT language_id AS languageId, language FROM Languages WHERE language_id = #{num}")
Languages findById(@Param("num")int num);
@Insert("INSERT INTO Languages (language_Id, language) VALUES(#{num}, #{language});")
void insert(@Param("num")int num, @Param("language") String language);
@Update("UPDATE Languages SET language = #{language} WHERE language_id = #{num}")
void update(@Param("num") int num, @Param("language") String language);
@Delete("DELETE FROM Languages WHERE language_id = #{num}")
void delete(@Param("num") int num);
}
Mapper - XML
@Mapper
public interface LanguagesMapper {
List<Languages> findAll();
Languages findById(@Param("num")int num);
void insert(@Param("num")int num, @Param("language") String language);
void update(@Param("num") int num, @Param("language") String language);
void delete(@Param("num") int num);
}
★ XML 방식으로 하려면 꼭 resources 하위에 mapper 폴더 만들고 xml 파일을 만들어 줘야 합니다.
LanguagesMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.ackmybatis.mapper.LanguagesMapper">
<resultMap id="languageResultMap" type="com.example.ackmybatis.entity.Languages">
<id property="languageId" column="language_id"/>
<result property="language" column="language"/>
</resultMap>
<select id="findAll" resultMap="languageResultMap">
SELECT language_id, language FROM Languages
</select>
<select id="findById" resultMap="languageResultMap" parameterType="int">
SELECT language_id, language FROM Languages WHERE language_id = #{num}
</select>
<insert id="insert" parameterType="com.example.ackmybatis.entity.Languages">
INSERT INTO Languages (language_id, language) VALUES (#{num}, #{language})
</insert>
<update id="update" parameterType="com.example.ackmybatis.entity.Languages">
UPDATE Languages SET language = #{language} WHERE language_id = #{num}
</update>
<delete id="delete" parameterType="int">
DELETE FROM Languages WHERE language_id = #{num}
</delete>
</mapper>
※ 경로 잘 확인해야 합니다!
Controller
@RestController
@RequiredArgsConstructor
public class MainController {
private final LanguagesMapper languagesMapper;
@GetMapping("")
public List<Languages> all() {
return languagesMapper.findAll();
}
@GetMapping("/{num}")
public ResponseEntity<?> getLanguage(@PathVariable int num){
Languages languages = languagesMapper.findById(num);
if(languages == null){
String msg = "데이터가 없습니다.";
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(msg);
}else {
return ResponseEntity.ok(languages);
}
}
@PostMapping("/create/{num}/{language}")
public ResponseEntity<String> create(@PathVariable int num, @PathVariable String language){
languagesMapper.insert(num, language);
String msg = num + " : " + language + "가 추가됐습니다.";
return ResponseEntity.ok(msg);
}
@PutMapping("/modify/{num}/{language}")
public ResponseEntity<String> update(@PathVariable int num, @PathVariable String language){
Languages languages = languagesMapper.findById(num);
if(languages == null){
String msg = "수정할 데이터가 없습니다.";
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(msg);
}else {
languagesMapper.update(num, language);
String msg = num + " : " + language + "로 수정됐습니다.";
return ResponseEntity.ok(msg);
}
}
@DeleteMapping("/erase/{num}")
public ResponseEntity<String> delete(@PathVariable int num){
Languages languages = languagesMapper.findById(num);
if(languages == null){
String msg = "삭제할 데이터가 없습니다.";
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(msg);
}else {
languagesMapper.delete(num);
String msg = num + "번이 삭제됐습니다.";
return ResponseEntity.ok(msg);
}
}
}
컨트롤러는 어떤 방식을 써도 잘 작동됩니다.
이제 Postman으로 잘 구현됐는지 확인해봅시다!
CRUD
Create (Post) - create();
Read (Get) - all();
Read (Get) - getLanguages();
Update (Put) - update();
Delete (Delete) - deleteLanguages();
MyBatis는 이번 포스팅을 하면서 처음 쓰게 되었는데 기본 쿼리문으로도 만들 수 있는 게 MyBatis의 장점인 것 같습니다.
'Study' 카테고리의 다른 글
WAS와 WS의 차이 파헤치기 (0) | 2023.10.07 |
---|---|
CI/CD 파헤치기 (0) | 2023.10.06 |
[Spring boot]MariaDB Sample Database로 RESTful API 만들기 (0) | 2023.09.21 |
[Spring] MVC 패턴 파헤치기 (0) | 2023.09.12 |
[Spring] @RequestBody, @RequestParam, @ModelAttribute 파헤치기 (0) | 2023.09.12 |