[Java] Mybatis + PostgreSQL 연동

신재호·2022년 3월 15일
1

Java

목록 보기
3/4
post-thumbnail

이 글은 PostgreSQL 설정이 완료된것을 전제로 작성되었습니다.

목표

이번 글에서는 Mybatis와 PostgreSQL을 설정하여 DB 데이터를 조회하는것이 목표입니다.

Mybatis 및 PostgreSQL 설정

  • pom.xml
<!--DB 연결 설정(mybatis, postgreSQL)-->
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
</dependency>
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>2.1.3</version>
</dependency>
  • application.yml
spring:
  datasource:
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://localhost:5432/dev_db
    username: savernet
    password: savernet

mybatis:
#  mapper 파일의 경로를 지정합니다. 아래 형식은 mapper 디렉토리 하위의 모든 xml 파일을 포함합니다.
  mapper-locations: mapper/**/*.xml
  configuration:
# db 컬럼명에서 언더바를 제거한 카멜케이스로 변경하여 리턴합니다.
    map-underscore-to-camel-case: true
# @Alias를 스캔하는 경로를 설정합니다. 아래 형식은 프로젝트의 전체를 스캔합니다.
  type-aliases-package: com.study.first_project

DB 테이블 생성 및 데이터 입력

create table mmbr (
    mmbr_id varchar(20),
    mmbr_pwd varchar(20) not null,
    mmbr_nm varchar(10),
    mmbr_join_dtm timestamp,
    primary key(mmbr_id)
);

insert into mmbr
select 'savernet'
       , 'abc1234'
       , '홍길동'
       , now()
union all
select 'savernet2'
       , 'abc1234'
       , '이순신'
       , now()
union all
select 'savernet3'
       , 'abc1234'
       , '강감찬'
       , now();

VO 생성

DTO, VO, Entity의 개념이 다르지만, 본 글에서는 편의성을 위해 VO만 사용하여 개발을 진행하였습니다.

java.com.study.first_project 경로에 VO 디렉토리를 생성 후 VO 클래스를 추가합니다.

@Alias("MmbrVO")
@Getter
@Setter
public class MmbrVO {
    String mmbrId;
    String mmbrPwd;
    String mmbrNm;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    LocalDateTime mmbrJoinDtm;
}
  • @Alias : 해당 어노테이션을 설정하면 Mapper에서 전체 경로 대신에 Alias에 입력한 값으로 호출 할 수 있습니다. 단, Alias는 전체 프로젝트 중에서 유일해야 합니다.

  • @Getter : Getter 메소드를 생성해줍니다.

  • @Setter : Setter 메소드를 생성해줍니다.

  • @JsonFormat : jackson에서 제공하는 어노테이션으로 JSON응답값의 형식을 지정할 때 사용합니다. pattern을 사용하여 날짜 형식을 지정할 수 있습니다.

  • @DateTimeFormat : Spring에서 지원하는 어노테이션으로 해당 어노테이션이 붙은 필드나 매게변수를 날짜 또는 시간으로 선언하는 어노테이션입니다. pattern을 사용하여 날짜 형식을 지정할 수 있습니다.

Mapper.xml 생성

application.yml 파일에서 설정한 mapper-location 설정에 맞게 디렉토리 및 Mapper.xml 파일을 생성합니다.
mapper-location은 resources 디렉토리가 루트 디렉토리이므로 resources -> mapper 디렉토리를 생성하고 mapper 디렉토리에 FirstDAOMapper를 생성합니다.

<?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.study.first_project.DAO.FirstDAO">
    <select id="selectMmbrList" resultType="MmbrVO">
        select *
        from mmbr
    </select>
</mapper>
  • namespace : 해당 Mapper와 매핑되는 DAO의 경로를 작성합니다.
    mapper를 활용하기 때문에 DAO는 interface로 생성을 해야합니다.

DAO설정

@Mapper
public interface FirstDAO {
    List<MmbrVO> selectMmbrList();
}
  • @Mapper : 해당 어노테이션을 선언하여 해당 Interface와 Mapper.xml의 namespace를 연결합니다.
  • 메서드의 명칭과 리턴타입은 Mapper의 id와 resultType과 동일해야합니다.

전체 소스

DAO의 결과를 출력해야 되므로 기존에 String으로 설정한 리턴타입을 변경합니다.

Controller

@RestController
@RequiredArgsConstructor
@RequestMapping("/first")
public class FirstController {
    private final FirstService firstService;

    @GetMapping("/0001")
    public ResponseEntity<List<MmbrVO>> getFirst(){
        List<MmbrVO> result = firstService.helloWorld();
        return new ResponseEntity<List<MmbrVO>>(result, HttpStatus.OK);
    }

}

Service

@Service
@RequiredArgsConstructor
public class FirstServiceImpl implements FirstService {

    private final FirstDAO dao;

    @Override
    public List<MmbrVO> helloWorld() {
        return dao.selectMmbrList();
    }
}

호출 결과

현재는 별도의 호출 화면이 없어 get 방식의 호출만 사용이 가능합니다.
다음 시간에는 swagger 설정을 진행한 후 post 및 delete 등의 방식을 사용해보록 하겠습니다.

전체 소스는 Gitlab 에서 확인할 수 있습니다.

profile
Data에 관심이 많은 웹개발자

0개의 댓글