배운점
- 버전 의존성, springboot3를 사용한다면, mybatis도 3으로 맞춰야 함.
- DDL 생성시 TB_ prefix 붙이기, 예약어 충돌 에러 남.
설정
gradle
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
implementation group: 'org.mybatis.spring.boot', name: 'mybatis-spring-boot-starter', version: '3.0.2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
작업 순서
- interface mapper 만들고 @Mapper 설정, Main 클래스에서 MapperScan을 넣던지 둘중 하나 지정, 참고로 MapperScan을 넣으면 interface 객체 생성시 매번 @Mapper를 넣지 않아도 되니 불필요한 보일러플레이트 코드를 줄일 수 있다고 생각함.
- /src/resources/mapper/*.xml 파일 만들고 Query 넣기
- DDL 쿼리 만들어서 넣어주기
- USER같은 이름은 이미 예약어로 사용하고 있어서 에러가 난다. 반드시 prefix를 넣어서 에러가 나지 않도록 명명한다. ex) TB_USER
- application.yml에서 xml 패스 지정 및 패키지 알리아스 설정 하기
- commandRunner에서 확인해 보기
spring:
h2:
console:
enabled: true
path: /h2-console
datasource:
url: jdbc:h2:mem:testdb
username: sa
password:
jpa:
show-sql: true
hibernate:
ddl-auto: create
mybatis:
type-aliases-package: com.kyy.carbackend.domain
mapper-locations: mappers/**/*.xml
logging:
level:
org:
mybatis: TRACE
<?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.kyy.carbackend.mapper.UserMapper">
<select id="selectUserById" resultType="User">
SELECT * FROM TB_USER WHERE id = #{id}
</select>
</mapper>
package com.kyy.carbackend.mapper;
import com.kyy.carbackend.domain.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper {
User selectUserById(Long id);
}
@SpringBootApplication
@Slf4j
@RequiredArgsConstructor
@MapperScan("com.kyy.carbackend.mapper")
public class CarbackendApplication implements CommandLineRunner {
INSERT INTO `TB_USER` (`name`, `phone`, `addr`) VALUES ('김영희', '010-1234-5678', '서울시 강남구');
INSERT INTO `TB_USER` (`name`, `phone`, `addr`) VALUES ('이철수', '010-9876-5432', '서울시 서초구');
INSERT INTO `TB_USER` (`name`, `phone`, `addr`) VALUES ('박지민', '010-4567-1234', '부산시 해운대구');
CREATE TABLE `TB_USER`
(
`id` BIGINT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`phone` VARCHAR(255) NOT NULL,
`addr` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`)
);
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<!-- Appenders -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<charset>UTF-8</charset>
<Pattern>%d %5p [%c] %m%n</Pattern>
</encoder>
</appender>
<appender name="console-infolog" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<charset>UTF-8</charset>
<Pattern>%d %5p %m%n</Pattern>
</encoder>
</appender>
<!-- Logger -->
<logger name="com.kyy" level="DEBUG" appender-ref="console" />
<logger name="jdbc.sqlonly" level="INFO" appender-ref="console-infolog" />
<logger name="jdbc.resultsettable" level="INFO" appender-ref="console-infolog" />
<!-- Root Logger -->
<root level="off">
<appender-ref ref="console" />
</root>
</configuration>