티스토리 뷰
사용한 기술 및 버전
maven project
spring boot 2.4.5
java (jdk 1.8)
프로젝트 생성
아래 사이트에서 spring boot 프로젝트를 필요한 dependencies를 추가해 생성해줍니다.
dependencies
Spring Boot DevTools, Lombok, Spring Web, H2 Database
IDE는 이클립스를 사용했습니다. intelliJ나 VSCode등 다른 IDE를 사용해도 무방합니다.
DevTools는 자동 재시작등 편의성을 위해서 추가하였습니다. 꼭 추가하지 않아도 괜찮습니다.
H2 연동
제가 사용한 DB는 H2 Database 입니다. InMemory DB로 간단한게 실습해볼때 좋은 DB입니다.
Dependencies에 추가했으므로 프로젝트를 실행한 뒤 아래 주소로 접속하면 H2 Console을 볼 수 있습니다.
http://localhost:8080/h2-console
url, username, password를 지정해주기위해 properties를 설정해줍니다.
spring boot 2.3부터 프로젝트 시작시 H2의 console주소가 바뀌기때문에 url도 함께 지정해줍니다.
src/main/resources/application.properties
# DataSource
spring.datasource.url=jdbc:h2:mem:mybatis-test
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true
spring.datasource.hikari.maximum-pool-size=4
TestRunner
H2에 잘 접속되는지 확인하기 위해 Runner를 만들어 실행해봅니다.
package com.example.demo;
import java.sql.Connection;
import javax.sql.DataSource;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Component
@RequiredArgsConstructor
@Slf4j
public class TestRunner implements ApplicationRunner {
private final DataSource dataSource;
@Override
public void run(ApplicationArguments args) throws Exception {
Connection connection = dataSource.getConnection();
log.info("DBCP: {}", dataSource.getClass());
log.info("Url : {}", connection.getMetaData().getURL());
log.info("username : {}", connection.getMetaData().getUserName());
}
}
console 결과
2021-04-17 00:33:19.331 INFO 22752 --- [ restartedMain] com.example.demo.TestRunner : DBCP: class com.zaxxer.hikari.HikariDataSource
2021-04-17 00:33:19.332 INFO 22752 --- [ restartedMain] com.example.demo.TestRunner : Url : jdbc:h2:mem:mybatis-test
2021-04-17 00:33:19.332 INFO 22752 --- [ restartedMain] com.example.demo.TestRunner : username : SA
테이블 및 데이터 준비
연습에 사용할 테이블과 데이터를 미리 준비합니다.
src/main/resources 경로에 schema.sql, data.sql 에 작성된 쿼리를 어플리케이션 실행시 기본적으로 실행합니다.
src/main/resources/schema.sql
DROP TABLE IF EXISTS Member;
CREATE TABLE Member
(
id IDENTITY PRIMARY KEY,
name VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
email VARCHAR(255)
);
src/main/resources/data.sql
INSERT INTO Member(name, password, email) VALUES('James', '1234', 'james@email.com');
INSERT INTO Member(name, password, email) VALUES('Hans', '1234', 'hans@email.com');
INSERT INTO Member(name, password, email) VALUES('Sumi', '1234', 'sumi@email.com');
JdbcTemplate를 이용한 데이터 삽입
H2 DB에 제대로 데이터가 삽입되는지 확인해봅니다.
TestRunner.java
@Component
@RequiredArgsConstructor
@Slf4j
public class TestRunner implements ApplicationRunner {
private final DataSource dataSource;
private final JdbcTemplate jdbcTemplate;
@Override
public void run(ApplicationArguments args) throws Exception {
Connection connection = dataSource.getConnection();
log.info("DBCP: {}", dataSource.getClass());
log.info("Url : {}", connection.getMetaData().getURL());
log.info("username : {}", connection.getMetaData().getUserName());
jdbcTemplate.execute("INSERT INTO member(name, password, email) VALUES('Lion', '1234', 'lion@email.com')");
}
}
MyBatis 연동
application.propertices MyBatis 관련 설정
# mapper.xml 경로 설정
mybatis.mapper-locations: mybatis-mapper/**/*.xml
# camel case 설정
mybatis.configuration.map-underscore-to-camel-case=true
# package model 경로 설정
mybatis.type-aliases-package=com.example.demo.model
model 생성
Members 테이블의 결과를 담을 Model을 생성해줍니다.
com.example.demo/model/Member.java
package com.example.demo.model;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class Member {
private Long id;
private String name;
private String password;
private String email;
}
dao (mapper interface 작성)
com.example.demo.dao/MemberMapper.xml
MyBatis가 매퍼를 스캔할수 있도록 @Mapper 어노터에션을 붙혀줍니다.
매퍼는 테이블과 쿼리가 연동되는 메소드를 정의해줍니다.
package com.example.demo.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.example.demo.model.Member;
@Mapper
public interface MemberMapper {
Member selectMemberById(Long id);
List<Member> selectAllMembers();
void insertMember(Member member);
}
xml 쿼리 작성
src/main/resources/mybatis-mapper/MemberMapper.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">
<mapper namespace="com.example.demo.dao.MemberMapper">
<select id="selectMemberById" resultType="Member">
SELECT id
,name
,password
,email
FROM member
WHERE id = #{memberId}
</select>
<select id="selectAllMembers" resultType="Member">
SELECT id
,name
,password
,email
FROM member
</select>
<insert id="insertMember" parameterType="Member">
INSERT INTO member (name, password, email)
VALUES (#{name}, #{password}, #{email})
</insert>
</mapper>
테스트 작성
com.example.demo/MemberTest.java
package com.example.demo;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.example.demo.dao.MemberMapper;
import com.example.demo.model.Member;
import lombok.extern.slf4j.Slf4j;
@SpringBootTest
@Slf4j
class MemberTest {
@Autowired
MemberMapper mapper;
@Test
public void findMemberById() {
Member member = mapper.selectMemberById(1L);
log.info("{}", member);
assertNotNull(member);
}
@Test
public void findAllMembers() {
List<Member> list = mapper.selectAllMembers();
log.info("{}", list);
assertNotNull(list);
}
@Test
public void insertMember() {
Member member = Member.builder()
.name("Fride")
.password("1234")
.email("fride@email.com")
.build();
mapper.insertMember(member);
}
}
결과
2021-04-17 11:47:24.123 INFO 3752 --- [ main] com.example.demo.TestRunner : DBCP: class com.zaxxer.hikari.HikariDataSource
2021-04-17 11:47:24.123 INFO 3752 --- [ main] com.example.demo.TestRunner : Url : jdbc:h2:mem:mybatis-test
2021-04-17 11:47:24.123 INFO 3752 --- [ main] com.example.demo.TestRunner : username : SA
2021-04-17 11:47:24.545 INFO 3752 --- [ main] com.example.demo.MemberTest : [Members(id=1, name=James, password=1234, email=james@email.com), Members(id=2, name=Hans, password=1234, email=hans@email.com), Members(id=3, name=Sumi, password=1234, email=sumi@email.com), Members(id=4, name=Lion, password=1234, email=lion@email.com), Members(id=5, name=Fride, password=1234, email=fride@email.com)]
2021-04-17 11:47:24.552 INFO 3752 --- [ main] com.example.demo.MemberTest : Members(id=1, name=James, password=1234, email=james@email.com)
reference