Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- literal
- 1px border
- entity
- 0.25px border
- Websocket
- 0.5px border
- angular
- 서버리스 #
- &연산
- Strict
- jwt
- 10px
- 클론코딩
- 당근마켓
- 으
- 0.75px border
- 컴포넌튼
- ES5
- github
- ZOOM
- 문서번호
- TypeScript
- 전역변수
- 데이터베이스 #try #이중
- es6
- 타입스크립트
- font-size
- TS
- npm
- Props
Archives
- Today
- Total
복잡한뇌구조마냥
[JAVA] Spring Data JPA 본문
1. Spring Data JPA란?
- JPA를 더 쉽게 쓰도록 도와주는 Spring 프로젝트
- 반복적인 DAO/Repository 구현을 자동화
- 인터페이스만 정의하면 CRUD 메서드를 자동 제공
👉 JPA는 EntityManager를 직접 쓰지만, Spring Data JPA는 Repository 인터페이스 기반으로 훨씬 단순화됩니다.
2. 의존성 추가 (Gradle)
dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
runtimeOnly("com.h2database:h2")
}
3. Entity 예제
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
@Entity
@Getter @Setter
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 100)
private String name;
}
4. Repository 인터페이스
import org.springframework.data.jpa.repository.JpaRepository;
public interface MemberRepository extends JpaRepository<Member, Long> {
// 기본 CRUD 자동 제공
// save(), findById(), findAll(), delete() ...
// 쿼리 메서드 추가
Member findByName(String name);
}
- JpaRepository<T, ID> 상속 → T=Entity, ID=PK 타입
- 별도 구현체 작성할 필요 없음
5. Service + Controller 예제
@Service
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository;
public Member create(String name) {
Member m = new Member();
m.setName(name);
return memberRepository.save(m);
}
public List<Member> findAll() {
return memberRepository.findAll();
}
}
@Controller
@RequiredArgsConstructor
@RequestMapping("/member")
public class MemberController {
private final MemberService memberService;
@PostMapping("/create")
@ResponseBody
public String create(@RequestParam String name) {
memberService.create(name);
return "저장 완료";
}
@GetMapping("/list")
@ResponseBody
public List<Member> list() {
return memberService.findAll();
}
}
6. 쿼리 메서드 (Method Name Query)
Spring Data JPA는 메서드 이름만으로 쿼리 생성
List<Member> findByNameContaining(String keyword);
List<Member> findByNameStartsWith(String prefix);
List<Member> findByNameAndAge(String name, int age);
- Containing → LIKE 검색
- StartsWith / EndsWith
- And, Or 조합 가능
7. @Query (JPQL 직접 작성)
public interface MemberRepository extends JpaRepository<Member, Long> {
@Query("SELECT m FROM Member m WHERE m.name LIKE %:name%")
List<Member> searchByName(@Param("name") String name);
}
8. 페이징 & 정렬
Page<Member> findByName(String name, Pageable pageable);
// 사용 예시
PageRequest pageRequest = PageRequest.of(0, 10, Sort.by("name").descending());
Page<Member> members = memberRepository.findByName("홍길동", pageRequest);
9. 장단점
✅ 장점
- CRUD 반복 코드 제거 → 생산성 ↑
- 쿼리 메서드, @Query 지원
- 페이징, 정렬 내장
❌ 단점
- 너무 복잡한 쿼리는 한계 → QueryDSL, Native Query 필요
- 엔티티 설계가 잘못되면 성능 문제 발생
10. 마무리
Spring Data JPA는 JPA를 훨씬 간단하게 사용할 수 있게 해주지만, 내부적으로는 여전히 **JPA(EntityManager)**가 동작합니다.
따라서 JPA 기본기를 먼저 이해한 후 사용하는 것이 중요합니다.
👉 실무에서는 Spring Data JPA + QueryDSL 조합이 가장 많이 사용됩니다.
LIST
'BE > JAVA' 카테고리의 다른 글
[JAVA] AOP (관점 지향 프로그래밍) 기초 정리 (0) | 2025.08.22 |
---|---|
[JAVA] Thymeleaf 기초 정리 (0) | 2025.08.20 |
[JAVA] TDD에서 자주 쓰는 테스트 어노테이션 정리 (2) | 2025.08.18 |
[JAVA] Effective Java - ordinal 메서드 대신 인스턴스 필드를 사용하라 (35) (1) | 2025.08.17 |
[JAVA] Effective Java - 타입 안전 이종 컨테이너를 고려하라(33) (0) | 2025.08.16 |