LG CNS 부트캠프 학습일지 25일차
학습 내용
- Spring Boot 개발환경 구축
- 어노테이션을 사용해서 Spring Boot 컴포넌트 만들기
- MyBatis를 사용해서 데이터베이스 접근하기
어노테이션을 사용해서 Spring Boot 컴포넌트 만들기
혼자 스프링부트 사용법을 공부하면서 스프링부트는 어노테이션 (Annotation) 을 많이 사용된다는 것은 알고 있었다.
1
2
3
4
5
@Controller
@RequestMapping("/user")
public class UserController {
...
}
@Transactional
이 어노테이션이 어디서 왜 필요한지는 아직 구체적으로는 모르겠다. 하지만 데이터베이스에 접근할 때는 필요할 것 같다는 느낌은 들었다. 무슨 말이냐면, 일반적으로 거래(transaction)이라는 것은 동시에 이루어지는 것이다. 예를 들어 원칙적인 의미에서 물건을 사고파는 거래행위는 물건과 현금을 동시에 주고 받는다. 물건을 먼저 준다면 구매자는 물건을 받고 도망갈 수 있고, 현금을 먼저 준다면 판매자는 현금을 받고 도망갈 수도 있다.
데이터베이스에 있는 어떤 데이터를 삭제하고 추가하는 작업이 하나로서 이루어져야할 때가 있다. 있어보이게 말하자면 데이터의 무결성을 유지하려는 것이다. 이런 경우에 클래스나 메소드에 @Transactional 어노테이션을 달아주면 그 안에서 이루어지는 작업은 하나로서 수행되는 것이다. 다만, 그것이 구체적으로 어떻게 구현되는지는 강의를 들으면서 알아봐야겠다.
MyBatis를 사용해서 데이터베이스 접근하기
MyBatis는 꽤 어려웠다. 이 도구의 요지는 스프링부트 웹앱과 데이터베이스가 어떻게 상호작용 하는지를 개발자가 직접 SQL을 작성해서 정한다는 것이다. 강의를 따라가면서 사용법은 대충 이해했는데, 필요성에 대해서는 느끼지 못했다. 데이터베이스를 자바 객체로 만들어서 접근할 수 있게하는 라이브러리가 있을텐데, 그것을 사용하지 않고 개발자 스스로 쿼리문을 작성하는 것이다. 물론 그 이유는 쉽게 예상할 수 있다.
- 현업에서는 MyBatis를 사용하기 떄문이다
- 쿼리문을 최적화해서 성능향상을 꾀할 수 있기 때문이다
MyBatis를 사용하려면 /resources/mappers/ 아래에 .xml 파일을 만들어 주어야 한다. UserMapper 인터페이스로 선언한 메소드를 id로 전달해서 그 메소드를 호출할 때 어떤 쿼리문을 실행할 것인지를 정의하는 방식이다. 지난 일주일간 배웠던 데이터베이스 쿼리문을 이렇게 활용할 수 있었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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.path.to.UserMapper">
<insert id="insertRow"
parameterType="com.example.path.to.UserRequestDTO">
INSERT INTO USER_TBL(EMAIL, PASSWORD, NAME)
VALUES(#{email}, #{password}, #{name})
</insert>
<select id="selectRow"
resultType="com.example.path.to.UserResponseDTO">
SELECT EMAIL, PASSWORD, NAME
FROM USER_TBL
</select>
<select id="selectRowByUser"
parameterType="com.example.path.to.UserRequestDTO"
resultType="com.example.path.to.UserResponseDTO">
SELECT EMAIL, PASSWORD, NAME
FROM USER_TBL
WHERE
EMAIL = #{email}
AND PASSWORD = #{password}
AND NAME = #{name}
</select>
</mapper>
Comments powered by Disqus.