• JDBC, Mybatis, JPA

    2024. 12. 29.

    by. hyunji1109

    프로젝트를 시작할 때 가장 먼저 고민하게 되는 것 중 하나가 '데이터베이스와 어떻게 상호작용할 것인가'이다. 
    Spring JDBC, MyBatis, JPA는 이 문제를 해결하는 대표적인 도구들이다.

     

    1. Spring JDBC

    특징

    • Spring Framework에서 제공하는 JDBC API를 활용한다.
    • SQL을 직접 작성하고 데이터베이스 작업을 수행 한다.

     

    장점

    • 간단하다.
      • 기본적인 SQL 사용 가능, 로우 레벨 제어 용이하다.
    • 유연성
      • SQL 작성과 실행에 대한 완벽한 제어 가능 하다.

     

    단점

    • 코드 반복
      • 반복적인 코드(예: SQL 작성, 결과 매핑 등)가 많다.
    • 복잡성
      • 대규모 프로젝트에서 유지보수 어렵다.
    • 확장성 부족
      • 복잡한 매핑 및 관계 설정이 불편 하다.

     

     

    2. MyBatis

    특징

    • SQL 매퍼 프레임워크로, XML 또는 어노테이션 기반으로 SQL을 정의한다.
    • SQL과 객체 간 매핑을 지원하여 코드 중복을 줄인다.
    • 동적 쿼리 생성 가능하다.

     

    장점

    • SQL 제어
      • SQL 작성이 자유롭고 동적 쿼리 처리 가능하다.
    • 객체 매핑 지원
      • 객체와 SQL 결과를 자동 매핑한다.
    • 확장성
      • 복잡한 SQL을 간결하게 관리한다.

     

    단점

    • XML 관리 부담
      • 대규모 프로젝트에서 매퍼 XML 파일 관리 복잡하다.
    • ORM 부족
      • 객체와 테이블의 관계 매핑 자동화 기능 부족하다.

     

    ORM
    Object-Relational Mapping의 약자로 객체와 관계형 데이터베이스를 매핑하는 기술이다. 
    객체 지향 프로그래밍에서 객체와 데이터베이스의 테이블을 서로 연결하는 방법을 의미한다.

     

    3. JPA

    특징

    • Java Persistence API로, 객체-관계 매핑(ORM)을 지원한다.
    • SQL 대신 객체 중심으로 데이터베이스를 조작한다.
    • Hibernate가 가장 많이 사용되는 JPA 구현체이다.

     

    장점

    • 생산성
      • SQL 대신 객체 중심으로 작성 가능하다.
    • 자동화
      • 엔티티와 테이블 간 매핑, 쿼리 생성, 데이터 관리 자동화한다.
    • 유지보수
      • 비즈니스 로직 중심 설계로 가독성 높다.

     

    단점

    • 학습 곡선
      • ORM 개념과 JPA의 동작 방식 학습 필요하다.
    • 성능 문제
      • 잘못된 매핑이나 쿼리 최적화 부족 시 성능 저하 가능하다.
    • 제한된 SQL 제어
      • 복잡한 SQL 제어는 불편할 수 있다.

     

      Spring JDBC MyBatis JPA
    SQL 작성 직접 작성 필요 직접 작성 필요 자동 생성 가능 (JPQL 사용)
    매핑 방식 수동 매핑 객체 매핑 지원 ORM (객체-관계 매핑) 지원
    유지보수 반복 코드 많아 어려움 XML 관리 필요 비즈니스 중심으로 쉬움
    유연성 SQL 제어 자유로움 SQL과 동적 쿼리 처리 쉬움 객체 중심이라 SQL 제어 제약
    사용 사례 간단한 CRUD 중심 애플리케이션 SQL 중심의 프로젝트(SQL이 복잡한) 객체 모델 중심 대규모 프로젝트

     


     

    예제

    📘가정

    테이블 이름: users
    컬럼: id, name, email
    목표: id를 기준으로 사용자를 조회

     

    1. Spring JDBC

    DAO 

    @Repository
    public class UserDao {
        private final JdbcTemplate jdbcTemplate;
    
        public UserDao(JdbcTemplate jdbcTemplate) {
            this.jdbcTemplate = jdbcTemplate;
        }
    
        public User getUserById(int id) {
            String sql = "SELECT id, name, email FROM users WHERE id = ?";
            return jdbcTemplate.queryForObject(sql, new Object[]{id}, (rs, rowNum) -> 
                new User(
                    rs.getInt("id"), 
                    rs.getString("name"), 
                    rs.getString("email")
                )
            );
        }
    }

     

    User

    public class User {
        private int id;
        private String name;
        private String email;
    
        public User(int id, String name, String email) {
            this.id = id;
            this.name = name;
            this.email = email;
        }
    
        // Getters and setters
    }

     

     

    2. MyBatis

    Mapper XML

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

     

    Mapper 인터페이스

    @Mapper
    public interface UserMapper {
        User getUserById(int id);
    }

     

    User

    public class User {
        private int id;
        private String name;
        private String email;
    
        // Getters and setters
    }

     

    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);
        }
    }

     

     

    3. JPA

    Entity

    @Entity
    @Table(name = "users")
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
        private String name;
        private String email;
    
        // Getters and setters
    }

     

    Repository

    @Repository
    public interface UserRepository extends JpaRepository<User, Integer> {
        User findById(int id);
    }

     

    Service

    @Service
    public class UserService {
        private final UserRepository userRepository;
    
        public UserService(UserRepository userRepository) {
            this.userRepository = userRepository;
        }
    
        public User getUserById(int id) {
            return userRepository.findById(id);
        }
    }

     

      장점 단점
    Spring JDBC SQL 제어가 쉬움
    간단한 사용 가능
    코드량 많음
    복잡한 쿼리 처리 불편
    MyBatis SQL과 객체 매핑 지원
    동적 쿼리 작성 쉬움
    XML 관리 부담
    ORM 기능 부족
    JPA 객체 중심 설계 가능
    자동화된 데이터 관리
    학습 곡선 높음
    고급 SQL 제어 어려움

     

    'CS > 웹개발' 카테고리의 다른 글

    JWT  (0) 2025.01.01
    쿠키, 세션  (0) 2024.12.30
    TCP와 UDP  (0) 2024.12.26
    HTTP  (0) 2024.12.24
    HTTP, HTTP API, CSR, SSR  (1) 2024.12.23

    댓글