Spring Boot 프로젝트를 진행하면서 그동안은 MyBatis로만 데이터베이스를 다뤄왔습니다. 하지만 이번 프로젝트에서는 JPA를 사용하게 되었고, 처음에는 다소 생소한 개념들이 많았지만 구조를 하나하나 정리하면서 점차 이해할 수 있었습니다. 이 글에서는 MyBatis만 사용해본 입장에서 JPA의 전체 구조를 어떻게 이해했는지 순서대로 정리해보겠습니다.
JPA와 MyBatis의 가장 큰 차이점
MyBatis는 SQL 중심의 프레임워크입니다. XML이나 어노테이션을 통해 SQL을 직접 작성하고, 그 결과를 Java 객체에 매핑합니다. 반면, JPA는 객체 중심으로 동작합니다. SQL은 자동으로 생성되며, 객체와 객체 사이의 관계를 바탕으로 데이터베이스와 소통합니다.
즉, MyBatis는 "어떤 쿼리를 실행할 것인가"에 집중하고, JPA는 "어떤 객체를 저장하고 불러올 것인가"에 집중합니다.
JPA의 전체 구조 이해하기
JPA의 구조는 아래와 같은 4가지 주요 구성요소로 나뉩니다.
1. Entity 클래스
데이터베이스 테이블과 1:1로 매핑되는 클래스입니다.@Entity
, @Table
, @Id
, @Column
등 어노테이션을 통해 정의합니다.
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
}
여기까지가 MyBatis에서 VO
클래스와 비슷한 역할입니다. 하지만 JPA에서는 이 Entity 자체가 데이터 조작의 주체가 됩니다.
2. Repository 인터페이스
JPA에서는 SQL을 직접 작성하지 않아도 CRUD 작업이 가능합니다.JpaRepository
를 상속받아 인터페이스만 정의하면 Spring Data JPA가 구현체를 자동 생성해줍니다.
public interface MemberRepository extends JpaRepository<Member, Long> {
List<Member> findByName(String name);
}
메서드 이름만 정의하면 자동으로 쿼리를 생성해준다는 점이 매우 인상적이었습니다.
3. Service 클래스
비즈니스 로직을 처리하는 계층입니다. Repository를 호출하여 원하는 작업을 수행합니다.
@Service
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository;
public Member save(String name, String email) {
Member member = new Member();
member.setName(name);
member.setEmail(email);
return memberRepository.save(member);
}
}
4. Controller
외부에서의 요청을 받아 Service를 통해 결과를 응답합니다. Rest API를 개발할 때 사용하는 구조입니다.
@RestController
@RequiredArgsConstructor
@RequestMapping("/members")
public class MemberController {
private final MemberService memberService;
@PostMapping
public ResponseEntity<Member> save(@RequestBody MemberDto dto) {
Member saved = memberService.save(dto.getName(), dto.getEmail());
return ResponseEntity.ok(saved);
}
}
흐름 정리: 요청부터 저장까지
- 클라이언트가
/members
로 POST 요청을 보냅니다. - Controller가 요청을 받아 Service에 위임합니다.
- Service가 Repository를 호출하여 Entity를 저장합니다.
- Repository는 JPA 내부에서 자동 생성된 쿼리를 실행해 DB에 저장합니다.
- 저장된 결과를 다시 클라이언트에 응답합니다.
JPA가 주는 이점
- 반복적인 SQL 작성 없이 CRUD 구현 가능
- 객체 지향적인 설계가 가능하여 유지보수 용이
- 연관관계 설정, Lazy Loading, Cascade 등 다양한 기능 제공
- 트랜잭션 처리와 1차 캐시 기능이 내장되어 성능 개선 가능
처음 사용할 때 느꼈던 포인트
Entity
클래스에 기본 생성자가 반드시 있어야 함@Id
와@GeneratedValue
설정을 반드시 해줘야 함application.yml
에ddl-auto: update
설정을 하면 테이블을 자동 생성할 수 있음- 데이터 수정 시 객체만 바꾸고
save()
호출하면 됨 (UPDATE SQL 작성 불필요)
JPA는 처음에는 다소 어렵게 느껴질 수 있지만, 객체 중심으로 생각하고 구조를 익히면 훨씬 생산성 있게 개발할 수 있습니다. 특히 반복적인 SQL 작성을 줄일 수 있다는 점에서 팀 개발에도 효과적이라는 생각이 들었습니다.
'개발 (Development) > Java' 카테고리의 다른 글
[Java] Interface란? 클래스와 다른 점은? (0) | 2025.08.03 |
---|---|
[Java] MyBatis와 JPA 속도 비교: 어떤 상황에 어떤 선택이 더 나을까? (0) | 2025.08.03 |
[Java] Spring Boot 프로젝트에서 MyBatis와 JPA를 함께 사용하는 방법과 오류 해결 과정 (0) | 2025.08.03 |
[Java] Spring Boot 2.x + Java 11 환경에서 JPA Native Query와 DTO 매핑 문제 해결 기록 (4) | 2025.08.03 |
[Java] PostgreSQL의 timestamptz를 Java MyBatis에서 Instant로 받는 방법 (2) | 2025.07.28 |