Spring Boot에서 Spring Data JPA 활용하기

1. 프로젝트 의존성 추가

Spring Data JPA를 사용하려면 Maven 또는 Gradle 빌드 파일에 다음 의존성을 추가해야 합니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

2. 애플리케이션 설정

application.properties 또는 application.yml 파일에 JPA 관련 설정을 추가합니다. Hibernate가 데이터베이스 스키마를 자동으로 생성하도록 설정합니다.

spring.jpa.hibernate.ddl-auto=update
#sql 로그 출력 여부
#spring.jpa.show-sql=true

이 설정은 애플리케이션 실행 시 엔티티 클래스를 기반으로 테이블을 자동으로 생성합니다. 개발 환경에서는 update 또는 create 옵션을 사용하고, 운영 환경에서는 validate 또는 none을 권장합니다.

3. 엔티티 클래스 정의

데이터베이스 테이블과 매핑될 엔티티 클래스를 생성합니다. 다음 예제는 회원을 나타내는 엔티티입니다.

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;

@Entity
@Table(name = "t_member")
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long memberId;

    private String memberName;

    private String email;

    private String phoneNumber;
}

@Entity 어노테이션은 해당 클래스가 JPA 엔티티임을 나타내고, @Table은 매핑될 테이블 이름을 지정합니다. @Id는 기본 키 필드를, @GeneratedValue는 키 생성 전략을 정의합니다.

4. 레포지토리 인터페이스 생성

데이터 접근을 담당하는 레포지토리 인터페이스를 선언합니다. Spring Data JPA가 이 인터페이스의 구현체를 자동으로 생성합니다.

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;

@Repository
public interface MemberRepository extends JpaRepository<Member, Long>, JpaSpecificationExecutor<Member> {
}

JpaRepository는 기본적인 CRUD 작업을 위한 메서드를 제공하고, JpaSpecificationExecutor는 동적 쿼리 작성을 위한 기능을 지원합니다.

5. 서비스 계층 구현

비즈니스 로직을 처리하는 서비스 인터페이스와 구현 클래스를 작성합니다.

public interface MemberService {
    Member createMember(Member member);
    Member updateMember(Member member);
    void deleteMember(Long id);
    Member findById(Long id);
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MemberServiceImpl implements MemberService {

    @Autowired
    private MemberRepository memberRepository;

    @Override
    public Member createMember(Member member) {
        return memberRepository.save(member);
    }

    @Override
    public Member updateMember(Member member) {
        return memberRepository.save(member);
    }

    @Override
    public void deleteMember(Long id) {
        memberRepository.deleteById(id);
    }

    @Override
    public Member findById(Long id) {
        return memberRepository.findById(id).orElse(null);
    }
}

@Service 어노테이션은 해당 클래스가 서비스 계층의 컴포넌트임을 나타냅니다. @Autowired를 통해 레포지토리를 의존성 주입받습니다.

6. 컨트롤러 구성

HTTP 요청을 처리하는 REST 컨트롤러를 작성합니다. 클라이언트에서 전송된 데이터를 받아 데이터베이스에 저장합니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/members")
public class MemberController {

    @Autowired
    private MemberService memberService;

    @PostMapping
    public ResponseEntity<Member> createMember(@RequestBody Member member) {
        Member saved = memberService.createMember(member);
        return ResponseEntity.ok(saved);
    }

    @GetMapping("/{id}")
    public ResponseEntity<Member> getMember(@PathVariable Long id) {
        Member member = memberService.findById(id);
        return ResponseEntity.ok(member);
    }

    @PutMapping("/{id}")
    public ResponseEntity<Member> updateMember(@PathVariable Long id, @RequestBody Member member) {
        member.setMemberId(id);
        Member updated = memberService.updateMember(member);
        return ResponseEntity.ok(updated);
    }

    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteMember(@PathVariable Long id) {
        memberService.deleteMember(id);
        return ResponseEntity.noContent().build();
    }
}

애플리케이션 실행 후 위 컨트롤러의 엔드포인트를 호출하면 요청 본문의 데이터를 데이터베이스에 자동으로 저장됩니다. @RestController는 RESTful API 컨트롤러임을 나타내며, @RequestMapping으로 기본 URL 경로를 설정합니다.

태그: Spring Boot Spring Data JPA jpa hibernate java

5월 24일 07:27에 게시됨