db 생성은 pgadmin을 통해 따로 진행하였다. (user table 하나 생성)
build.gradle 파일에 아래 코드를 추가한다.
dependencies {
...
implementation 'org.postgresql:postgresql:42.5.1'
...
}
resources/application.properties 파일에 아래 코드를 추가하여 설정을 완료한다.# postgresql
spring.datasource.hikari.maximum-pool-size=4
spring.datasource.url=jdbc:postgresql://localhost:5432/springstudy #database명
spring.datasource.username=유저이름
spring.datasource.password=비밀번호
spring.datasource.driver-class-name=org.postgresql.Driver
build.gradle 파일에 아래 코드를 추가한다.dependencies {
...
// mybatis
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'
implementation 'org.mybatis:mybatis-spring:3.0.1'
implementation "org.mybatis:mybatis:3.4.5"
...
}
resources/application.properties 파일에 아래 코드를 추가한다.# mybatis
mybatis.config=mybatis/mybatis-config.xml
mybatis.type-aliases-package=com.first
mybatis.mapper-locations=classpath:mybatis/mapper/**/*.xml
mybatis.configuration.map-underscore-to-camel-case=true
resources 아래에 mybatis 폴더를 생성하고 MybatisConfig.xml 파일을 작성한다.<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<mappers>
<mapper resource="FirstMapper.xml"/>
</mappers>
</configuration>
그 다음, mapper와 sql xml 파일, dto 파일, controller와 service 파일을 생성해보자.
(hello.springmvc 아래에 first 디렉토리를 생성해 이곳에서 작업을 진행할 것이다.)
- 객체를 구성하기 위한 파일이다.
hello.springmvc.first.DTO.FirstDTO.java@Data
@NoArgsConstructor
@AllArgsConstructor
public class FirstDTO {
private Integer id;
private String name;
}
@Data : getter / setter / toString() 메서드 사용이 가능하다.@NoArgsConstructor : 파라미터가 없는 기본 생성자를 생성해준다.@AllArgsConstructor : 모든 필드에 대한 생성자를 생성한다. 의존성 주입 할 대상이 많아졌을 때 훨씬 깔끔하다. (여기선 필요없긴 하다)
- mapper은 xml 파일과 1:1 매핑되는 파일이다.
- xml에서 쿼리문을 작성할 때 각각의 쿼리문을 이곳에 정의한다고 생각하면 된다. (함수명, 파라미터)
hello.springmvc.first.Mapper.FirstMapper.java@Repository
@Mapper
public interface FirstMapper {
List<FirstDTO> selectUserList();
FirstDTO selectUserById(Integer userId);
}
@Repository : DB 처리에 사용되는 애노테이션이다.@Mapper : Mybatis에서 제공하는 애노테이션이다. xml파일로 구현할 것이라 아마 없어도 작동할 것이다. (혹시나 해서..)
- 쿼리문을 작성하는 xml 파일이다.
- mapper나 dto 빈을 못찾는다는 에러가 발생해서 경로를 자세히 작성해주었다.
selectUserList: 모든 사용자의 정보를 반환하는 쿼리.selectUserById: 해당 ID의 사용자 정보를 반환하는 쿼리.
resources.mybatis.mapper.FirstMapper.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">
<!--
[템플릿 설명]
- 해당 파일은 SQL 문을 작성하는 곳입니다.
-->
<mapper namespace="hello.springmvc.first.mapper.FirstMapper">
<select id="selectUserList" resultType="java.util.HashMap">
SELECT id,
name
FROM public."user";
</select>
<select id="selectUserById" resultType="hello.springmvc.first.DTO.FirstDTO">
SELECT id,
name
FROM public."user"
WHERE id = #{id}
</select>
</mapper>
Controller란 보통 url 매핑을 통해 사용자의 요청을 처리하고 응답 데이터를 구현해 응답하는 역할을 한다.
selectUserList(): 모든 사용자의 정보를 반환한다.selectUserById(): 해당 ID의 사용자 정보를 반환한다.
hello.springmvc.first.Controller.FirstController.java@RestController
@RequiredArgsConstructor
@RequestMapping("/first")
public class FirstController {
private final FirstService firstService;
@GetMapping()
public List<FirstDTO> selectUserList(){
List<FirstDTO> result = firstService.selectUserList();
return result;
}
@GetMapping("/{userId}")
public FirstDTO selectUserById(@PathVariable("userId") int userId){
FirstDTO result = firstService.selectUserById(userId);
return result;
}
@RestController : 응답 형태를 json 또는 xml 형태의 객체 데이터로 반환한다.@RequiredArgsConstructor : 생성자 주입을 편하게 하기 위해 사용한다. final 혹은 @NotNull이 붙은 필드의 생성자를 자동으로 만들어준다. (FirstService)@RequestMapping() : 요청 주소와 특정 메소드를 매핑하기 위해 사용한다.@GetMapping() : GET 방식의 요청에 해당하는 메소드
- Service는 Controller 대신 구체적이고 복잡한 로직들을 처리하는 단계이다. Controller에서는 Service를 주입받아 함수를 호출하는 정도만 한다.
- 확장성을 위해 Service interface를 따로 생성한다.
hello.springmvc.first.Service.FirstService.javapublic interface FirstService {
public List<FirstDTO> selectUserList();
public FirstDTO selectUserById(Integer userId);
}
hello.springmvc.first.Service.FirstServiceImpl.java@Service
@RequiredArgsConstructor
public class FirstServiceImpl implements FirstService{
private final FirstMapper firstMapper;
@Override
public List<FirstDTO> selectUserList() {
return firstMapper.selectUserList();
}
@Override
public FirstDTO selectUserById(Integer userId) {
return Optional.ofNullable(firstMapper.selectUserById(userId))
.orElseThrow(NotFoundException::new);
}
}
Consider defining a bean of type 'hello.springmvc.first.mapper.FirstMapper' in your configuration.
build.gradle 파일에서 버전만 바꿔주면 된다.org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.1org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0[스프링, Spring] @RequiredArgsConstructor 어노테이션
[JAVA] Spring Boot내에서 MyBatis & PostgreSQL 연동하기