요번 프로젝트에서는 JPA 가 사용된다고 한다.
그동안 myBatis 만 사용했었는데 좋은 배움의 기회일거 같다.
시작하기전 SpringBoot 환경에서 JPA 를 사용하는 방법을 공부하고 정리해보겠다!

JPA (Java Persistence API)
Java EE 플랫폼에서 제공하는 영속성을 관리하는 표준 API입니다. 데이터베이스의 데이터를 객체 지향적으로 관리할 수 있게 해줍니다.
좀더 쉽게 설명하자면
JPA 는 자바 객체를 데이터베이스 테이블에 자동으로 연결시켜주는 도구이다.
마치 자동차를 운전할때 엔진이 어떻게 작동한은지 모르더라도 운전을 할 수 있는 것 처럼 복잡한 SQL 문을 사용하지 않아도, DB 와 소통할 수 있게 해주는 도구이다.
JPA는 복잡한 내부 작업을 숨기고 간단하게 데이터를 다루게 해준다.
마치 자동차의 자동 변속기처럼, 우리는 내부 작업을 몰라도 데이터를 쉽게 처리할 수 있다.
MyBatis는 리모컨처럼 더 많은 제어권을 우리 손에 쥐어준다. 마치 수동 변속기처럼, 더 정교한 제어가 필요할 때 사용할 수 있다.
[클라이언트] -> DTO -> [Controller] -> DTO -> [Service] --
|
[데이터베이스] <- Entity <- [Repository] <- Entity <--- |
이런식으로 구성이 된다.
DTO (Data Transfer Object)
계층 간 데이터 교환을 위해 사용되는 객체 데이터의 전달만을 위한 객체로, 로직을 포함하지 않음DAO (Data Access Object)
데이터베이스의 데이터에 접근하기 위한 객체의 인터페이스 실제 데이터베이스와의 CRUD 연산을 수행함Entity
데이터베이스의 테이블과 매핑되어, 데이터베이스의 레코드를 객체 지향적으로 사용할 수 있게 해주는 클래스
우선 각 데이터의 흐름을 살펴보자.
클라이언트에서 Controller로 이동
클라이언트는 사용자의 요청을 DTO를 통해 컨트롤러에 전달
Controller에서 Service로 이동
컨트롤러는 받은 DTO를 그대로 서비스 계층에 전달하여 비즈니스 로직을 처리
Service에서 Repository로, 그리고 Repository에서 데이터베이스로 이동
서비스 계층에서 처리된 비즈니스 로직의 결과를 바탕으로 생성된 Entity가 레파지토리를 통해 데이터베이스에 저장
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/register")
public User registerUser(@RequestBody UserDTO userDTO) {
return userService.registerUser(userDTO);
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User registerUser(UserDTO userDTO) {
User user = new User();
user.setUsername(userDTO.getUsername());
user.setPassword(userDTO.getPassword()); // 실제로는 암호화 처리 필요
user.setEmail(userDTO.getEmail());
return userRepository.save(user);
}
}
public class UserDTO {
private String username;
private String password;
private String email;
// Getters and Setters
}
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
private String email;
// Getters and Setters
}
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
위 소스의 작동방식은 아래와 같다.
클라이언트 요청:
클라이언트가 /register 엔드포인트로 회원가입 요청을 보냅니다.
이 요청은 UserDTO 객체를 JSON 형태로 담고 있습니다.
컨트롤러 처리:
UserController가 이 요청을 받아 @RequestBody 애노테이션을 통해 요청 본문의 JSON을 UserDTO 객체로 변환합니다.
그리고 이를 UserService의 registerUser 메소드에 전달합니다.
서비스 로직 실행:
UserService는 UserDTO에서 정보를 추출하여 User 엔티티 객체를 생성하고,
이를 UserRepository의 save 메소드에 전달하여 데이터베이스에 저장합니다.
데이터베이스 반영:
JpaRepository의 save 메소드는 전달받은 User 엔티티를 데이터베이스에 저장합니다.
새로운 엔티티인 경우에는 삽입 쿼리를, 이미 존재하는 엔티티의 경우에는 업데이트 쿼리를 실행합니다.