SERVER/Spring Boot

[SpringBoot] Spring boot JPA ์‚ฌ์šฉํ•˜์—ฌ ํšŒ์›๊ฐ€์ž… ๊ตฌํ˜„ํ•˜๊ธฐ

GaGah 2020. 12. 19. 22:50

๐Ÿ– Spring boot JPA ์‚ฌ์šฉํ•˜์—ฌ ํšŒ์›๊ฐ€์ž… ๊ตฌํ˜„ํ•˜๊ธฐ - ๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๊ธฐ

โ–ถ ๋“ค์–ด๊ฐ€๊ธฐ

Server ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๋นผ๋†“์„ ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Spring Boot ์—์„œ DB๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ, ๊ทธ ์ค‘ JPA๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

DB ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•
1) JDBC Connection Pool
2) MyBatis ์™€ Mapper
3) JPA

 

โ–ถ JPA๋ž€?

JPA๋Š” Java Persistence API์˜ ์•ฝ์ž๋กœ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ด€๋ฆฌ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์ž๋ฐ” API ์ด๋‹ค.

์ด๋Š” ORM(Object-Relational Mapping)๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ธ๋ฐ, ์ง์ ‘ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ๋ฉ”์†Œ๋“œ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ DB๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

CASE1) ORM  : findAll() // ์•Œ์•„์„œ ์ฟผ๋ฆฌ๋กœ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค.
CASE2) Mybatis/Mapper : SELECT * FROM TB_USER

 

์‹ค์ œ JPA๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๊ณ , ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

> ๊ตฌํ˜„์ฒด์˜ ์ข…๋ฅ˜ : DataNucleus, Eclipse Link, Hibernate, Spring Data JPA

> Spring Data JPA ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐ›์•„์™€์„œ ์‚ฌ์šฉํ•  ๊ฒƒ

 

 

 

๐Ÿ– [์˜ˆ์ œ] JPA ์‚ฌ์šฉํ•˜์—ฌ ํšŒ์›๊ฐ€์ž… ์ •๋ณด๋ฅผ ์ €์žฅ

1. build.gradle์˜ dependencies์— spring data JPA ์ถ”๊ฐ€

	//db
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'mysql:mysql-connector-java'

 

 

2. User table์˜ ์—ญํ• ์„ ํ•  model์„ ์ž‘์„ฑ

โ–ถ MySQL User table

 

โ–ถ User ๊ฐ์ฒด ์ž‘์„ฑ

@NoArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_idx")
    private Long userIdx;

    @Column(name = "email")
    private String email;

    @Column(length = 400, name = "password")
    private String password;

    @Column(length = 400, name = "salt")
    private String salt;

    @Column(name = "name")
    private String name;

    @Column(name = "gender")
    private String gender;
}

@Entity, @Table

 - DB ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘ํ•˜๋Š” ๊ฒƒ์œผ๋กœ JPA๊ฐ€ ๊ด€๋ฆฌํ•œ๋‹ค.

 

์ฃผ์˜์‚ฌํ•ญ

 - ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋Š” ํ•„์ˆ˜ // @NoArgsConstructor

 - ์ €์žฅํ•  ํ•„๋“œ๋ฅผ final ์‚ฌ์šฉ ๋ถˆ๊ฐ€

 

 

3. JPA Repository ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์„ฑ

public interface UserInfoRepository extends JpaRepository<User, Long> {

     User findByEmail(String email); //์ด๋ฉ”์ผ๋กœ user ์กฐํšŒ

     List<User> findAll(); //์ „์ฒด ์กฐํšŒ    
}

์ด ๋ถ€๋ถ„์ด ๋ฐ”๋กœ ORM ๊ธฐ์ˆ ์ด ์‚ฌ์šฉ๋œ ๋ถ€๋ถ„์ด๋‹ค.

์šฐ๋ฆฌ๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ์กฐํšŒ, ์‚ญ์ œ, ์ˆ˜์ •, ๋“ฑ๋ก ๋“ฑ์„ ํ•  ์ˆ˜ ์žˆ๊ณ  ๋‚ด๋ถ€์ ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด DB์— ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์ค€๋‹ค. 

 

 

 

4. application.properties ์„ค์ • 

spring.datasource.url=jdbc:mysql://localhost:3306/authorization?useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=์ด๋ฆ„
spring.datasource.password=๋น„๋ฐ€๋ฒˆํ˜ธ
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# MySQL ์ƒ์„ธ ์ง€์ •
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

# DB Application ๊ตฌ๋™ํ• ๋•Œ๋งˆ๋‹ค ์–ด๋–ป๊ฒŒ ํ• ์ง€? -> ์˜ต์…˜ ์„ค์ •
spring.jpa.hibernate.ddl-auto = none

โ–ถ spring.jpa.hibernate.ddl-auto

์„œ๋ฒ„๋ฅผ ์‹คํ–‰ ์‹œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™” ์ „๋žต์„ ์„ค์ •

 

โ–ถ ์ข…๋ฅ˜

์˜ต์…˜ ์„ค๋ช… 
none ์•„๋ฌด๊ฒƒ๋„ ์„ค์ •ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค. (๊ธฐ๋ณธ๊ฐ’)
create ๊ธฐ์กด์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ dropํ•˜๊ณ  ์ƒˆ๋กœ ๋งŒ๋“ค๊ธฐ
create-drop ํ…Œ์ด๋ธ”์„ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ , ์•ฑ์ด ๊บผ์ง€๊ธฐ ์ „์— ์ง€์šฐ๊ธฐ
update Entity์— ๋ณ€๊ฒฝ๋œ column์„ ํ…Œ์ด๋ธ”์— ๋ฐ˜์˜
validate Entity์— ๋ณ€๊ฒฝ๋œ ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ๋ณ€๊ฒฝ๋œ ์ ๋“ค์„ ์ถœ๋ ฅํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ข…๋ฃŒ

 

 

5. Service์—์„œ JPA๋กœ ๊ตฌํ˜„๋œ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ

@RequiredArgsConstructor
@Service
public class UserService {
    private final UserInfoRepository userInfoRepository;
    
    //ํšŒ์›๊ฐ€์ž…
    public DefaultResponseDTO insertUser(UserInfoRequestDTO userInfo) {
        User user = new User();

        //pw, salt๋ฅผ user์— ์ €์žฅ
        user.setEmail(userInfo.getEmail());
        user.setName(userInfo.getName());
        user.setGender(userInfo.getGender());
        user.setPassword(encryptPW);
        user.setSalt(encryption.getSalt());
        
        //DB์— ์ €์žฅ
        userInfoRepository.save(user);

        return new DefaultResponseDTO("ํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต!_!");
   	 }
   }

 

 

 

6. DB์— ๊ฐ’์ด ์ €์žฅ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค!

 

DB๋ฅผ ์กฐํšŒํ•ด๋ณด๋ฉด ๊ฐ’์ด ๋“ค์–ด๊ฐ„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

LIST