JPA(์๋ฐ ํผ์์คํด์ค API) vs MyBatis
JPA (์๋ฐ ํผ์์คํด์ค API) | MyBatis (๋ง์ด๋ฐํฐ์ค) | |
๊ณตํต์ | Java ๊ธฐ๋ฐ์ Spring ๋๋ SpringBoot์์ ์ฌ์ฉ DB์ฐ๋ ๊ธฐ์ DB๋ฅผ ์ฌ์ฉํ ๋ ๋ฒ๊ฑฐ๋ก์ด ๋ฐ๋ณต์์ ์ ์์ ์ค |
|
์ฐจ์ด์ | ORM(Object Relation Mapping) ๊ธฐ์ : ๊ฐ์ฒด์ DB์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ๋งคํ SQL๋ฌธ๊น์ง ์๋์ผ๋ก ์์ฑ, DB ๋ฐ์ดํฐ์ Java ๊ฐ์ฒด๋ฅผ ๋งคํ์์ผ์ค์ผ๋ก์จ MyBatis๋ณด๋ค ํธ๋ฆฌํ์ง๋ง ๋ฐฐ์ฐ๊ธฐ ์ด๋ ค ๊ฐ์ฒด ์งํฅ์ ๊ฐ๋ฐ์ ์ค์ ๊ฐ๋จํ ๋งคํ ๋ฐ ๊ฐ์ฒด ์งํฅ์ ์ธ ์ ๊ทผ์ด ํ์ํ ๊ฒฝ์ฐ ์ ํ |
SQL Mapper ๊ธฐ์ : ๊ฐ๋ฐ์๊ฐ ์์ฑํ SQL ์คํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฒด์ ๋งคํ XML ํ์ผ๋ก SQL๋ฌธ Java์ ๋ถ๋ฆฌ SQL๊ฐ๋ฐ๊ณผ ์ ์ง๋ณด์์ ์ฉ์ด ๋์ SQL ์์ฑ ๊ธฐ๋ฅ ์ ์์ ๋ถ ํ๋ ์์ํฌ์์ ์ฌ์ฉ ๋ณต์กํ ์ฟผ๋ฆฌ์ SQL ์ ์ด๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ ํ |
JPA ํ๊ฒฝ ์ค์
- 'build.gradle'์ JPA ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ
dependencies {
...์๋ต
// implementation 'org.springframework.boot:spring-boot-starter-jdbc' //jdbc๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ง์๋ ๋จ
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'
...์๋ต
}
- 'application.properties'์ JPA ์ค์ ์ถ๊ฐ
#JPA
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
* ddl-auto : JPA๋ ํ ์ด๋ธ์ ์๋์ผ๋ก ์์ฑํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋๋ฐ none ๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ๊ธฐ๋ฅ์ ๋๋ค. create ๋ฅผ ์ฌ์ฉํ๋ฉด ์ํฐํฐ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ํ ์ด๋ธ๋ ์ง์ ์์ฑํด์ค๋ค.
JPA ์ํฐํฐ ๋งคํ
๊ธฐ์กด Member ํด๋์ค์ @Entity ์ด๋ ธํ ์ด์ ๋ฌ์์ค
package hello.hello_spring.domain;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity //JPA๊ฐ ๊ด๋ฆฌํ๋ Entity
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) //PK ์ค์
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- JPA ํ์ ๋ฆฌํฌ์งํ ๋ฆฌ
package hello.hello_spring.repository;
import hello.hello_spring.domain.Member;
import jakarta.persistence.EntityManager;
import java.util.List;
import java.util.Optional;
public class JpaMemberRepository implements MemberRepository{
private final EntityManager em;
public JpaMemberRepository(EntityManager em) {
this.em = em;
}
@Override
public Member save(Member member) {
em.persist(member); //.persist()ํ๋ฉด JPA๊ฐ ์๋์ผ๋ก INSERT๋ฌธ ์์ฑํ๊ณ member์ setId๊น์ง ํด์ค.
return member;
}
@Override
public Optional<Member> findById(Long id) {
Member member = em.find(Member.class, id); //.find()ํ๋ฉด JPA๊ฐ ์๋์ผ๋ก SELECT๋ฌธ ์์ฑํ์ฌ ์กฐํํจ.
return Optional.ofNullable(member); //์กฐํํ์๋ null๊ฐ์ด ์์ ์ ์์ผ๋ฏ๋ก Optional์ ๊ฐ์ผ๋ค.
}
@Override
public Optional<Member> findByName(String name) {
List<Member> result = em.createQuery("select m from Member m where m.name = :name", Member.class)
.setParameter("name", name)
.getResultList();
return result.stream().findAny();
}
@Override
public List<Member> findAll() {
return em.createQuery("select m from Member m", Member.class)
.getResultList();
}
}
JPA์ ์์์ฑ ์ปจํ ์คํธ em.persist();๋ฑ๋ฑ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ถํ์ ๊ณต๋ถํ๋๋ก ํ์โ
- Service ๊ณ์ธต์๋ @Transaction ์ด๋ ธํ ์ด์ ์ถ๊ฐ
=> JPA๋ฅผ ํตํ ๋ชจ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ํธ๋์ญ์ ์์์ ์คํํด์ผ ํ๋ค.
- JPA๋ฅผ ์ฌ์ฉํ๋๋ก ์คํ๋ง ์ค์ ๋ณ๊ฒฝ
package hello.hello_spring;
import hello.hello_spring.repository.*;
import hello.hello_spring.service.MemberService;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class SpringConfig {
private EntityManager em;
@Autowired
public SpringConfig(EntityManager em) {
this.em = em;
}
/*
private DataSource dataSource;
@Autowired
public SpringConfig(DataSource dataSource) {
this.dataSource = dataSource;
}
*/
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
// return new MemoryMemberRepository();
// return new JdbcMemberRepository(dataSource); //JDBC ์ฐ๊ฒฐ ํ Configuration ๋ถ๋ถ๋ง ์์ ํ๋ฉด ๋จ.
// return new JdbcTemplateMemberRepository(dataSource); //JdbcTemplate
return new JpaMemberRepository(em); //JPA
}
}
์ฐธ๊ณ ) ์คํ๋ง๋ถํธ์ JPA ํ์ตํ ํ '์คํ๋ง ๋ฐ์ดํฐ JPA ' ์ฌ์ฉํ๋ฉด ๋์ฑ๋ ํธ๋ฆฌํ๊ฒ ๊ฐ๋ฐํ ์ ์๋ค.
'๋ฐฑ์๋(Back-End) ๊ฐ๋ฐ > SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SpringBoot] 7_AOP(๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ) (0) | 2025.02.27 |
---|---|
[SpringBoot] 6.6_์คํ๋ง ๋ฐ์ดํฐ JPA (0) | 2025.02.26 |
[SpringBoot] 6.4_์คํ๋ง JdbcTemplate (0) | 2025.02.26 |
[SpringBoot] 6.3_์คํ๋ง ํตํฉ ํ ์คํธ (DB์ฐ๊ฒฐ) (0) | 2025.02.26 |
[SpringBoot] 6.2_์์ JDBC (0) | 2025.02.26 |