📖 Spring Boot의 DB 연동 방법과 Mybatis를 통해 DB를 사용하는 방법에 대해서 알아보자.
OS : Windows
IDE : Intellij
SpringBoot : 2.7.6
DB : Postgresql 42.5.2
Persistence : Mybatis 2.2.0
Build : Gradle
먼저 Spring Boot에 DB를 연결하기 위하여 의존성을 추가해준다.
dependencies {
... 생략
runtimeOnly group: 'org.postgresql', name: 'postgresql', version: '42.5.2'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
}
이후 DB 정보를 설정한다
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://{IP주소}:5432/{DB명}?characterEncoding=UTF-8&serverTimezone=Asia/Seoul
spring.datasource.username={사용자명}
spring.datasource.password={비밀번호}
여기서 포트번호가 5432인 이유는 Postgresql 서버의 포트번호이기 때문이다. 오라클의 경우 1521, Mysql의 경우 3306이 될 것이다.
이렇게 설정하면 DB에 대한 연동 설정은 완료되었으니 다음 단계로 넘어가자.
아래와 같이 의존성을 추가해준다.
dependencies {
... 생략
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'
}
나는 mapper를 기존 Spring Legacy에서 사용했더 방식으로 xml에 작성하여 사용한다. 이러한 이유로 해당 mapper의 경로를 잡아주기 위하여 아래 설정을 진행하자.
# Mybatis config
mybatis.mapper-locations=mapper/*.xml
위와 같이 작성하고, 아래 사진과 같이 패키지 구조를 생성하면된다.
여기서 UserMapper.xml이 위치한 곳이 위에 설정한 경로가 되는 것이다.
Mapper.xml을 매핑 할 인터페이스를 선언해주어야한다. 추상 메소드를 사용하여 .xml에 선언한 쿼리문을 수행 할 예정이기 때문에 다음 예시를 보자.
@Mapper
public interface UserMapper {
// 메소드명은 Mapper.xml에 작성될 쿼리문의 ID
User selectUser(User user);
}
Mapper 인터페이스가 위치한 패키지는 다음과 같다.
이제 인터페이스와 1:1로 매핑 할 .xml 파일을 작성하면된다. namespace는 인터페이스 패키지 경로를 포함한 이름으로 하면된다.
<?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.demo.demoproject.model.repository.UserMapper">
<select id="selectUser" resultType="User">
select * from [테이블명] where [컬럼1]=#{[값1]} and [컬럼2]=#{[값2]}
</select>
</mapper>
여기서 중요한 부분은 mapper의 namespace는 반드시 패키지 경로를 포함해야하며, 쿼리문의 resultType 등에 작성되는 클래스의 이름은 패키지 경로를 포함하여 작성하는 것이 원칙이고, alias를 등록하여 사용 할 수 있다.
# Mybatis config
mybatis.mapper-locations=mapper/*.xml
mybatis.type-aliases-package=com.demo.demoproject.domain
이런식으로 설정해주면 aliases에 등록한 패키지명은 생략해도 무방하다.
이제 DB와 데이터를 주고받을 Mapper에 대한 준비를 끝냈으며 Service를 작성하여 결과를 반환시켜보자.
@Service
public class UserService {
@Autowired
UserMapper userMapper;
public User findUser(User user){
return userMapper.selectUser(user);
}
}
Service에서 반환된 값을 전달할 Controller 생성
@RestController
@Slf4j
public class LoginController {
@Autowired
private UserService userService;
@PostMapping("/login")
public ResponseEntity<User> login(@RequestBody User user) {
log.debug("로그인 요청 :: " + user);
return ResponseEntity.ok(userService.findUser(user));
}
}
여기까지 완성하면 View 영역에서 결과를 확인하면 된다.
Spring Legacy에 비하면 비교적 간단(?)하게 설정을 마친 것 같다.
그럼 이만.👊🏽