본문으로 바로가기

# Springboot + Mybatis + PostgreSQL DB 연동

category Computer Science/Java 2020. 6. 28. 21:48

Mybatis : 자바 오브젝트와 sql문 사이의 자동 Mapping 기능을 지원하는 Persistence 프레임워크의 SQL Mapper

- sql을 별도 파일로 분리해서 관리 가능

 

마이바티스 대체 : JPA, Hibernate (ORM)

 

- 환경 설정: 

          Intellij, Springboot 2.3.1, Maven, Java8

          PostgreSQL 12 버전, Mybatis 3.5.5

 

- Step: 

 

 

[PostgreSQL DB 테이블 생성]

- 테스트에 사용할 임의의 테이블 생성

create table post(
    id varchar(255) primary key NOT NULL,
    user_nm varchar(255),
    pwd varchar(255)
);

 

[DatabaseConfig 설정]

- DataSource : Connection Pool을 구현하기 위한 스펙을 정해놓은 인터페이스, DB연동을 위해 사용하는 객체

- sqlSession : sql문을 호출해주는 객체로, 이 객체를 통해 우리가 정의한 sql문으로 접근 가능

- sqlSessionFactory : sqlSession을 만드는 역할

- classpath : src/main/resources 매핑

@Configuration
@MapperScan(basePackages = "org.example.mapper") # mapper.xml 파일들이 바라볼 기본 패키지 위치 지정
@EnableTransactionManagement
public class DatabaseConfig {

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sessionFactory.setMapperLocations(resolver.getResources("mapper/*.xml"));
        return sessionFactory.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) throws Exception {
        final SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
        return sqlSessionTemplate;
    }
}

 

[application.properties 작성]

- PostgreSQL 설정 작성

## DB setting
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=
spring.datasource.password=

 

[domain 작성]

- Entity 및 DTO 

@Getter
@Setter
@NoArgsConstructor(force = true)
public class Post {

    private String id;
    private String user_nm;
    private String password;

    @Builder
    public Post(String id, String user_nm, String password) {
        this.id = id;
        this.user_nm = user_nm;
        this.password = password;
    }

}

 

[Mapper 작성]

- insert문 수행 / 테이블에 있는 모든 데이터 조회 / 특정 컬럼 or 한 줄 조회

public interface PostMapper {
    public List<Post> getAll() throws Exception;
    public Post getOne() throws Exception;

    public void insertPost(Post post) throws Exception;
}

 

[XML 작성]

- 테이블 컬럼 : pwd

- 코드 : password

- 둘 간의 매핑 : resultMap 사용

<?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="org.example.mapper.PostMapper">

    <resultMap id="PostResult" type="org.example.dto.Post">
        <result column="id" property="id"/>
        <result column="user_nm" property="user_nm"/>
        <result column="pwd" property="password"/>
    </resultMap>

    <select id="getAll" resultType="org.example.dto.Post">
        select * from public.post;
    </select>

    <select id="getOne" resultType="org.example.dto.Post">
        select * from public.post limit 1;
    </select>

    <insert id="postInsert" parameterType="org.example.dto.Post">
        insert into post
        values
        (#{id},#{user_nm},#{password})
    </insert>

</mapper>

 

[Controller 작성]

- 데이터 조회 관련

@RequiredArgsConstructor
@RestController
public class PostController {

    @Autowired
    private PostMapper postMapper;

    @RequestMapping(value = "all", method = RequestMethod.GET)
    public List<Post> getPostAll() throws Exception {
        return postMapper.getAll();
    }

    @RequestMapping(value = "one", method = RequestMethod.GET)
    public Post getPostOne() throws Exception {
        return postMapper.getOne();
    }


    @GetMapping(path = "/all2")
    public String getPost1() throws Exception {
        return String.format("%s %s", postMapper.getAll(), LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
    }

}

 

[Junit 테스트]

- insert 관련

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
@WebAppConfiguration
public class PostTest {

    @Autowired
    private PostMapper postMapper;

    @Test
    public void testMapper()  throws Exception {
        Post post = Post.builder().id("test").user_nm("test").password("test").build();
        postMapper.insertPost(post);

    }