지금까지 프로젝트를 진행하면서 데이터베이스를 사용할 때는 주로 Jakarta Persistence API(JPA)를 사용해왔다.
하지만 이번 프로젝트에서는 처음으로 MyBatis를 사용하게 되었다.
MyBatis는 SQL을 직접 작성하여 데이터베이스와 연동하는 방식이라는 점에서 JPA와 차이가 있다.
이번 글에서는 MyBatis의 기본 개념과 동작 방식에 대해 정리해보고자 한다.
💡 Mybatis
- SQL Mapper 프레임 워크
- 직접 SQL 작성
- 반복적인 SQL 작성 필요
- 복잡한 SQL 제어에 유리
ORM (Object Relational Mapping)
DB에 자동으로 매핑해주는 프레임 워크
💡 JPA
- Java persistence API, 객체 - 관계 매핑 표준
- JPQL 또는 메서드 이름 기반 쿼리
- 영속성 컨텍스트, JPQL 학습 필요
- CRUD 자동화로 생산성 높음
- 객체 중심 설계에 적합
<[JPA]
Controller (REST API 받음)
↓
Service (비즈니스 로직)
↓
Repository (인터페이스만, 구현체 자동 생성)
↓
Entity (객체 ↔ 테이블 자동 매핑)
↓
Database
[MyBatis]
Controller (REST API 받음)
↓
Service (비즈니스 로직)
↓
Mapper (인터페이스) + XML (SQL 작성)
↓
DTO/VO (데이터 전달 객체) -> model/도메인/dto, vo 존재
* DAO는 DB접근담당이고
* DTO는 계층간 데이터 전달용
↓
Database
Entity를 통해 데이터 처리 가능<@Entity
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
}
<select id="findUserById" parameterType="Long" resultType="User">
SELECT * FROM users WHERE id = #{id}
</select>
스프링 프로젝트 생성 후 필요한 의존성 추가
DB 설정
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/> // mysql 드라이버
<property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/> // mysql 사용
<property name="username" value="username"/> // 아이디
<property name="password" value="password"/> // 비밀번호
</bean>
MyBatis 설정
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory"/>
</bean>
MyBatis Mapper 작성과 등록
⇒ 정리하자면 XML에 SQL 쿼리들을 작성할 건데 그 SQL이 연결된 메서드를 정의할 파일
ex) CRUD 쿼리문을 XML에 작성하고. InsertItems(), Getitems(), modifyItems(), DeleteItems() 메서드가 있는 인터페이스 만들거임. 그리고 그 클래스를 Mapper라는 명칭으로 부르자 !
@Mapper // 등록
// 작성
public interface UserMapper {
User getUserById(int id);
void insertUser(User user);
void updateUser(User user);
void deleteUser(int id);
}
Mapper 인터페이스와 연결될 XML 작성
<mapper namespace="com.exmaple.mapper.UserMapper">
<select id="getUserById" parameterTytpe="int" resultType="com.example.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
<insert id="insertUser" parameterType="com.example.model.User">
INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>
<!-- 다른 메서드들에 대한 쿼리도 추가할 수 있다 -->
</mapper>
Mapper 사용
@Service
public class UserSerivce {
priate final UserMapper userMapper;
public UserService(UserMapper userMapper){
this.userMapper = userMapper;
}
// 유저 조회
public User getUsedById(int id){
return userMapper.getUserById(id);
}
// 유저 등록
public User insertUser(User user){
return userMapper.insertUser(user);
}