JPA ๋?
- ์๋ฐ์์ ๊ฐ์ฒด๋ฅผ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ๊ณผ ์๋์ผ๋ก ๋งคํํด์ฃผ๋ ORM(Object-Relational Mapping) ๊ธฐ์
- SQL์ ์ง์ ์์ฑํ์ง ์๊ณ ๋ ์๋ฐ ๊ฐ์ฒด๋ฅผ ์ ์ฅ,์กฐํ,์์ ,์ญ์ ํ ์ ์๊ฒ ํด์ค
๊ทธ๋ ๋ค๋ฉด ์ JPA๋ฅผ ์ฌ์ฉํ ๊น?
- MyBatis์ฒ๋ผ SQL ์ค์ฌ์ผ๋ก ๊ฐ๋ฐํ๋ฉด ํ ์ด๋ธ ๊ตฌ์กฐ๊ฐ ๋ฐ๋๋๋ง๋ค SQL ์์ ํด์ผ ํจ
- ํ์ง๋ง JPA๋ ์ํฐํฐ์ ํ
์ด๋ธ์ ๋งคํํด๋๋ฉด SQL์ ์๋์ผ๋ก ์์ฑ๋จ
- ๋น์ฆ๋์ค ๋ก์ง์ ์ง์คํ ์ ์๊ณ ์ ์ง๋ณด์๊ฐ ์ฌ์์ง๋ค๋ ์ฅ์ ์ด ์์
JPA ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์
| ๊ตฌ์ฑ ์์ | ์ค๋ช |
| Entity | DB ํ ์ด๋ธ๊ณผ ๋งคํ๋๋ ์๋ฐ ํด๋์ค |
| Repository | CRUD๋ฅผ ์ฒ๋ฆฌํ๋ ์ธํฐํ์ด์ค |
| EntitiyManager | JPA์ ํต์ฌ ๊ฐ์ฒด. ์ํฐํฐ ์ ์ฅ, ์กฐํ ๊ด๋ฆฌ |
| Persistence Context | ์ํฐํฐ ๊ฐ์ฒด๋ฅผ 1์ฐจ ์บ์๋ก ๊ด๋ฆฌํ๋ ์์ญ |
์์
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
private String email;
}
- @Entity : ์ด ํด๋์ค๊ฐ DB์ ํ ์ด๋ธ๊ณผ ๋งคํ๋๋ค๋ ์๋ฏธ (Member -> member ํ ์ด๋ธ)
- @Id : ๊ธฐ๋ณธ ํค(PK) ์ง์
- @GeneratedValue : ์๋ ์ฆ๊ฐ ์ ๋ต ์ง์ (AUTO, IDENTITY ๋ฑ) -> PK๊ฐ ์๋ ์์ฑ
- ๋๋จธ์ง ํ๋๋ ์ปฌ๋ผ์ผ๋ก ์๋ ๋งคํ (name, email)
-> Member ๊ฐ์ฒด๋ฅผ JPA๊ฐ DB ํ ์ด๋ธ์ ์๋์ผ๋ก ์ ์ฅ-์กฐํํ ์ ์๊ฒ ๋จ
public interface MemberRepository extends JpaRepository<Member, Long> {
List<Member> findByName(String name);
}
- JpaRepository๋ฅผ ์์ํ๋ฉด CRUD ๋ฉ์๋ (save, findAll, deleteById) ๋ฅผ ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํจ
- ๋ฉ์๋ ์ด๋ฆ ๊ธฐ๋ฐ์ผ๋ก ์ฟผ๋ฆฌ ์๋ ์์ฑ
- findByName("ํ๊ธธ๋") ์ด๋ฉด SELECT * FROM member WHERE name = 'ํ๊ธธ๋'
- ๋ณ๋์ SQL ์์ด ๋ฉ์๋ ์ด๋ฆ๋ง์ผ๋ก ์กฐ๊ฑด ๊ฒ์์ด ๊ฐ๋ฅํจ
@RestController
@RequiredArgsConstructor
public class MemberController {
private final MemberRepository memberRepository;
@PostMapping("/member")
public Member save(@RequestBody Member member){
return memberRepository.save(memeber);
}
@GetMapping("/member/{id}")
public Memeber find(@PathVariable Long id){
return memberRepository.findById(id).orElseThrow();
}
}
- @RestController : REST API ์ปจํธ๋กค๋ฌ์์ ๋ช ์ (JSON ์๋ต ์๋ ์ฒ๋ฆฌ)
- @RequiredArgsConstructor : final ํ๋ (memberRepository) ๋ฅผ ์์ฑ์ ์ฃผ์
- @PostMapping("/member") : ํ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญ ๋ณธ๋ฌธ(JSON)์ผ๋ก ๋ฐ์ DB์ ์ ์ฅ
- @GetMapping("/member/{id}") : id๋ก ํน์ ํ์์ ์กฐํ
- ๋ด๋ถ์์ Repository๊ฐ ์์์ SQL์ ์คํํ๋ฏ๋ก ์ง์ ์ฟผ๋ฆฌ ์ง์ง ์์
< ์คํ ํ๋ฆ ์์ฝ >
1. ์ฌ์ฉ์๊ฐ /member๋ก POST ์์ฒญ ๋ณด๋
2. Controller๊ฐ JSON -> Member ๊ฐ์ฒด๋ก ๋งคํ
3. Repository.save() ํธ์ถ -> JPA๊ฐ INSERT SQL ์์ฑ ๋ฐ ์คํ
4. ์ดํ GET /member/{id} ์์ฒญ ์ -> JPA๊ฐ SELECT SQL ์คํ ํ ๊ฐ์ฒด ๋ฐํ
-> ์ฝ๋์์๋ SQL์ด ์์ง๋ง ์ค์ ๋ก๋ JPA๊ฐ ๋ด๋ถ์ ์ผ๋ก SQL์ ๋ง๋ค์ด ์คํํจ
์ฃผ์ ์ด๋ ธํ ์ด์ ์ ๋ฆฌ
| @Entity | ํ ์ด๋ธ๊ณผ ๋งคํ๋๋ ํด๋์ค |
| @Id | ๊ธฐ๋ณธํค(PK) ์ง์ |
| @GeneratedValue | PK ์๋ ์์ฑ ์ ๋ต |
| @Column | ์ปฌ๋ผ๋ช , ์ ์ฝ์กฐ๊ฑด ์ค์ |
| @OneToMany, @ManyToOne | ์ฐ๊ด๊ด๊ณ ๋งคํ |
| @Transactional | ํธ๋์ญ์ ๋จ์ ๊ด๋ฆฌ |
์ ๋ฆฌ
- JPA๋ SQL์ ์๋ ์์ฑํ์ง๋ง ๋ด๋ถ์์ SQL์ด ์คํ๋จ
- ORM์ SQL์ ๋์ฒดํ๋ ๊ฐ๋ ์ด ์๋, ์ถ์ํ ๊ฐ๋ ์ผ๋ก ์ดํดํด์ผ ํจ
- ์ฑ๋ฅ ํ๋์ด ํ์ํ ๊ฒฝ์ฐ์๋ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์
'Backend > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [JPA] JPA ์ฐ๊ด๊ด๊ณ ๋งคํ 1 - 1:N, N:1, N:N (0) | 2025.11.12 |
|---|---|
| [Java] ํ๋ฆฌ๋ฏธํฐ๋ธ(Primitive) ํ์ ๊ณผ ๋ ํผ๋ฐ์ค(Reference) ํ์ (0) | 2024.12.07 |
| [Java] ์คํธ๋ฆผ์ filter()๋ก ์ํ๋ ์กฐ๊ฑด์ ๋ฐ์ดํฐ ํํฐ๋งํ๊ธฐ (2) | 2024.09.09 |
| [Java] Spring๊ณผ SpringBoot์ ์ฐจ์ด์ (0) | 2024.09.03 |
| [JAVA] ๋ฐฐ์ด ์ ๋ ฌ ๋ฉ์๋ Arrays.sort (0) | 2024.08.29 |