MyBatis란 무엇인가?

MyBatis vs JPA

목록 보기
2/6

Mybatis란 무엇인가?

마이바티스(MyBatis)는 Java 애플리케이션에서 데이터베이스와 상호작용하기 위한 SQL 매핑 프레임워크입니다.
JDBC를 단순화하고, SQL 문을 XML이나 애너테이션으로 관리할 수 있도록 도와주는 도구입니다.

MyBatis는 SQL을 직접 제어하면서도 객체 매핑을 쉽게 처리하고 싶은 경우 유용한 도구입니다. JDBC의 복잡함을 줄이면서도 SQL에 대한 완전한 제어가 필요할 때 적합하며, ORM 대신 SQL 중심의 개발을 선호하는 경우 좋은 선택입니다.
ORM(JPA)보다 더 가볍고 유연하며, 특히 복잡한 SQL 작업이 많은 프로젝트에서 널리 사용됩니다.

그래서 jpa 보다 복잡한 sql작업이 많은 경우 mybatis를 설정하면 좋을 것이다.
상황에 따라서 jpa 와 mybatis가 혼용되어 사용하는 경우도 많다고 들었다.

JPA 만 사용하던 내가 유의해야 할 점!!!


위 사진은 중요한 부분인것 같다.
나는 지금까지 JPA만 사용했기에, Repository를 사용했는데,
myBatis는 다른가보다.

mybatis에서는 mapper과 repository의 기능을 담당한다고 한다.
mapper에서 sql을 직접 작성한다는 것을 알면 될것 같다.


물론 mybatis돟 jpa와 유사한 계층형 아키텍쳐를 따르지만,
구성요소가 위와 같이 조금은 다르다.

그럼 예시를 보며 생각을 해보자.

controller

@RestController
@RequestMapping("/users")
public class UserController {
    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/{id}")
    public ResponseEntity<User> getUserById(@PathVariable int id) {
        User user = userService.getUserById(id);
        return ResponseEntity.ok(user);
    }
}

Service

@Service
public class UserService {
    private final UserMapper userMapper;

    public UserService(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    public User getUserById(int id) {
        return userMapper.getUserById(id);
    }
}

여기까지는 JPA와 크게 다를 것이 없어보인다.
그러나 차이점은 이 다음부터 나타나는 것 같다.

mapper 인터페이스

@Mapper
public interface UserMapper {
    User getUserById(int id); // XML 또는 애너테이션에서 이 메서드를 구현
}

mapper 인터페이스는 jpa에서 repositorty 인터페이스에 대응되는 인터페이스 인것 같다.
repository와 다른 점은, repository에서는 알아서 데이터베이스 작업이 완료 되었는데,
mybatis에서는 여기서 xml 혹은 어노테이션으로 넘어가야 하는 것 같다.
거기서 더 심화 작업을 하는 것이니,
당연히 jpa 보다는 더욱 세밀한 sql 작업이 가능하겠지

Mapper XML 파일

<mapper namespace="com.example.mapper.UserMapper">
    <select id="getUserById" parameterType="int" resultType="com.example.domain.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

위 xml 파일을 보면
SELECT * FROM users WHERE id = #{id}
이라는 sql문이 존재한다.
JPA를 쓸 시절에는 저런건 사용하지도 않았다.

흠... 그나마 비슷한 것을 본것은
@Query를 쓸 때????
비슷했던 것 같다.

Mybatis는 mapper 클래스 다음 순서는 xml 뿐만이 아니라 어노테이션 또한 있다.
위 xml 파일과 동일한 기능의 어노테이션 방식은 다음과 같다.

@Mapper
public interface UserMapper {

    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(int id);
}

XML 방식 vs 어노테이션 방식

선택지는 두가지이다.
그러면 둘 중 무엇을 선택할지의 고민은 다음과 같이 기준을 정하면 되지 않을까?

어떤 방식을 쓸지의 선택 기준

간단한 쿼리: 애너테이션 방식 사용.
복잡한 동적 SQL: XML 방식 사용. (, 같은 동적 태그를 활용).

profile
내가 있는 그 조직에서 가장 성실하기만 하자

0개의 댓글