JPA 와 함께하는 SpringBoot

최예준·2024년 2월 27일

공부

목록 보기
13/19

요번 프로젝트에서는 JPA 가 사용된다고 한다.
그동안 myBatis 만 사용했었는데 좋은 배움의 기회일거 같다.

시작하기전 SpringBoot 환경에서 JPA 를 사용하는 방법을 공부하고 정리해보겠다!

JPA 가 뭐야?

JPA (Java Persistence API)
Java EE 플랫폼에서 제공하는 영속성을 관리하는 표준 API입니다. 데이터베이스의 데이터를 객체 지향적으로 관리할 수 있게 해줍니다.

좀더 쉽게 설명하자면

JPA 는 자바 객체를 데이터베이스 테이블에 자동으로 연결시켜주는 도구이다.
마치 자동차를 운전할때 엔진이 어떻게 작동한은지 모르더라도 운전을 할 수 있는 것 처럼 복잡한 SQL 문을 사용하지 않아도, DB 와 소통할 수 있게 해주는 도구이다.

JPA와 MyBatis의 차이

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가 레파지토리를 통해 데이터베이스에 저장

회원가입 기능을 예시로 들어보겠다.

  • Controller: 클라이언트의 회원가입 요청을 받음.
  • Service: 비즈니스 로직 처리, 예를 들어, 비밀번호 암호화 및 유효성 검사.
  • Repository: 데이터베이스에 사용자 정보 저장.
  • DTO: 클라이언트로부터 받은 데이터 전달.
  • Entity: 데이터베이스의 사용자 테이블 매핑.

Controller 클래스 (UserController.java)

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

Service 클래스 (UserService.java)

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

DTO 클래스 (UserDTO.java)

public class UserDTO {
    private String username;
    private String password;
    private String email;

    // Getters and Setters
}

Entity 클래스 (User.java)

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
}

Repository 인터페이스 (UserRepository.java)

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 엔티티를 데이터베이스에 저장합니다.
새로운 엔티티인 경우에는 삽입 쿼리를, 이미 존재하는 엔티티의 경우에는 업데이트 쿼리를 실행합니다.

profile
개발도 잘하고픈 행복한 개발자

0개의 댓글