[Spring] Postgresql + Mybatis 연동하기

이수민·2023년 1월 21일

spring

목록 보기
3/12

postgresql 설정하기

  • 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

mybatis 연동

  • 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 디렉토리를 생성해 이곳에서 작업을 진행할 것이다.)


DTO 생성

  • 객체를 구성하기 위한 파일이다.
  • hello.springmvc.first.DTO.FirstDTO.java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class FirstDTO {

    private Integer id;

    private String name;
}
  • 간단하게 id와 name만으로 구성했다.

  • 애노테이션 설명
    • @Data : getter / setter / toString() 메서드 사용이 가능하다.
    • @NoArgsConstructor : 파라미터가 없는 기본 생성자를 생성해준다.
    • @AllArgsConstructor : 모든 필드에 대한 생성자를 생성한다. 의존성 주입 할 대상이 많아졌을 때 훨씬 깔끔하다. (여기선 필요없긴 하다)

mapper 생성

  • 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파일로 구현할 것이라 아마 없어도 작동할 것이다. (혹시나 해서..)

mapper 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 생성

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 생성

  • Service는 Controller 대신 구체적이고 복잡한 로직들을 처리하는 단계이다. Controller에서는 Service를 주입받아 함수를 호출하는 정도만 한다.
  • 확장성을 위해 Service interface를 따로 생성한다.
  • hello.springmvc.first.Service.FirstService.java
public 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.1
  • org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0

레퍼런스

[스프링, Spring] @RequiredArgsConstructor 어노테이션
[JAVA] Spring Boot내에서 MyBatis & PostgreSQL 연동하기

profile
BE 개발자를 꿈꾸는 학생입니다🐣

0개의 댓글