💡 Spring Boot에서의 Entity와 Repository 완벽 정리 (초보자용 실전 가이드)
Spring Boot는 자바 백엔드 개발의 대표 프레임워크로 자리 잡고 있으며, 그 중심에는 JPA(Java Persistence API)를 기반으로 한 Entity와 Repository가 존재합니다. 이 둘을 제대로 이해하는 것은 데이터 중심의 웹 애플리케이션을 개발할 때 아주 중요합니다.
이 포스트에서는 다음과 같은 흐름으로 자세히 설명드릴게요.
- Entity란 무엇인가?
- Repository란 무엇인가?
- Entity와 Repository의 관계
- 예제 프로젝트로 살펴보는 실전 코드
- 실무에서 자주 하는 실수와 팁
- 마무리 요약
1️⃣ Entity란 무엇인가?
📘 한 마디로 정의하자면?
Entity는 데이터베이스 테이블과 매핑되는 자바 클래스입니다.
예를 들어, 회원
정보를 저장하려면 데이터베이스에는 members
라는 테이블이 필요하고, 자바에서는 Member
라는 클래스를 만들어야겠죠. 이 Member
클래스가 바로 Entity입니다.
📌 Entity의 핵심 역할
- 데이터베이스의 테이블 구조를 자바 코드로 표현
- ORM(Object-Relational Mapping)을 통해 객체와 테이블 간 자동 매핑
- 비즈니스 로직과 분리된 데이터 구조 정의
🧩 Entity의 구성 요소
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 50)
private String name;
private String email;
// 생성자, getter/setter 등 생략
}
주요 어노테이션 설명
어노테이션 | 설명 |
---|---|
@Entity |
해당 클래스가 JPA Entity임을 명시 |
@Id |
Primary Key로 사용할 필드 지정 |
@GeneratedValue |
ID 값을 자동 생성할 전략 설정 |
@Column |
컬럼 속성 커스터마이징 (nullable, length 등) |
2️⃣ Repository란 무엇인가?
📘 Repository 한 줄 정의
Repository는 Entity 객체를 데이터베이스에 저장하거나 조회하는 기능을 담당하는 인터페이스입니다.
우리는 DB에서 데이터를 가져오거나 저장할 일이 많습니다. 그때마다 SQL을 직접 작성하면 생산성이 매우 떨어지겠죠. Spring Data JPA는 이런 번거로움을 해결해줍니다. 그냥 인터페이스만 만들어두면, JPA가 내부적으로 SQL을 자동 생성해줍니다!
🧩 Repository의 기본 구조
public interface MemberRepository extends JpaRepository<Member, Long> {
Member findByEmail(String email);
}
📌 Repository에서 제공하는 기능
메서드 | 설명 |
---|---|
save() |
엔티티 저장 (insert or update) |
findById() |
ID로 조회 |
findAll() |
전체 조회 |
deleteById() |
ID로 삭제 |
count() |
레코드 수 조회 |
existsById() |
해당 ID 존재 여부 확인 |
3️⃣ Entity와 Repository의 관계
Entity는 데이터 구조, Repository는 데이터 접근 로직을 담당합니다. 이 둘은 항상 쌍으로 동작하며, 보통 아래처럼 구성됩니다.
Member.java -> Entity (데이터 구조)
MemberRepository -> Repository (데이터 처리)
예를 들어, 사용자가 웹에서 회원가입을 하면:
- Controller가 요청을 받음
- Service가 비즈니스 로직 수행
- Repository가 Entity를 저장
- Entity는 DB 테이블에 매핑되어 실제로 저장됨
4️⃣ 실전 예제: 회원가입 기능 만들기
1. Entity 생성
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
private String email;
protected Member() {} // JPA용 기본 생성자
public Member(String name, String email) {
this.name = name;
this.email = email;
}
// Getter 생략
}
2. Repository 생성
public interface MemberRepository extends JpaRepository<Member, Long> {
Optional<Member> findByEmail(String email);
}
3. Service 계층
@Service
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository;
public Member saveMember(String name, String email) {
Member member = new Member(name, email);
return memberRepository.save(member);
}
public Member findByEmail(String email) {
return memberRepository.findByEmail(email)
.orElseThrow(() -> new RuntimeException("회원이 존재하지 않습니다."));
}
}
4. Controller
@RestController
@RequiredArgsConstructor
public class MemberController {
private final MemberService memberService;
@PostMapping("/members")
public ResponseEntity<String> saveMember(@RequestBody MemberRequest request) {
memberService.saveMember(request.getName(), request.getEmail());
return ResponseEntity.ok("회원 가입 완료");
}
@GetMapping("/members/email")
public ResponseEntity<Member> getMember(@RequestParam String email) {
return ResponseEntity.ok(memberService.findByEmail(email));
}
}
5. DTO 클래스
@Getter
public class MemberRequest {
private String name;
private String email;
}
5️⃣ 실무에서 자주 하는 실수 & 팁
❗ 실수 1: 기본 생성자 누락
- JPA는 내부적으로 리플렉션을 사용하여 객체를 생성하기 때문에 기본 생성자가 반드시 있어야 합니다.
❗ 실수 2: setter 무분별 사용
- Entity에 setter를 남발하면 추적하기 어렵고, 불변 객체 패턴에 위배될 수 있습니다.
- 되도록 생성자나 빌더 패턴을 활용하세요.
❗ 실수 3: 비즈니스 로직이 Entity에 있음
- Entity는 데이터 구조만 담당해야 합니다.
- 비즈니스 로직은 Service 계층에 위치시켜야 합니다.
💡 팁: 인터페이스만 만들면 끝!
JpaRepository
만 상속하면 CRUD는 자동 지원되므로, 로직에 집중할 수 있어요.- 복잡한 쿼리는
@Query
어노테이션 또는 QueryDSL 등을 사용하세요.
✅ 마무리 요약
개념 | 설명 |
---|---|
Entity | DB 테이블과 매핑되는 자바 클래스 |
Repository | Entity 객체를 DB에 저장하거나 조회하는 인터페이스 |
관계 | Entity는 구조, Repository는 조작 담당 |
장점 | SQL 없이 데이터 처리 가능, 생산성 향상 |
주의점 | 생성자 필수, setter 자제, 비즈니스 로직 분리 |
✍️ 마치며
처음 Spring Boot와 JPA를 접하면 "왜 이렇게 어노테이션이 많지?" "SQL은 어디서 짜지?" 하고 헷갈릴 수 있습니다. 하지만 Entity와 Repository의 개념을 확실히 잡고 나면, 데이터 처리 로직은 매우 간결하고 유지보수도 쉬워집니다.
이제 여러분도 Spring Boot에서 데이터를 다룰 때 더 이상 두렵지 않을 거예요!
'SpringBoot' 카테고리의 다른 글
"Thymeleaf란? Spring Boot와 함께하는 강력한 템플릿 엔진" (0) | 2025.03.26 |
---|---|
Controller와 Service란? (0) | 2025.03.19 |
스프링 부트 템플릿 엔진과 build.gradle 정리 (0) | 2025.03.19 |