티스토리 뷰

사용한 기술 및 버전

maven project

spring boot 2.4.5

java (jdk 1.8)

 

프로젝트 생성

아래 사이트에서 spring boot 프로젝트를 필요한 dependencies를 추가해 생성해줍니다.

dependencies

Spring Boot DevTools, Lombok, Spring Web, H2 Database

 

start.spring.io/

 

 

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

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함