๐ 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์ ๊ฐ์ด ์ ์ฅ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค!
'SERVER > Spring Boot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] ์คํ๋ง ํ๋ ์์ํฌ ์ดํดํ๊ธฐ (0) | 2020.12.30 |
---|---|
[Spring] Spring boot ํ๋ก์ ํธ ์ดํด๋ณด๊ธฐ (feat. ์ธ์ฆ์๋ฒ) (0) | 2020.12.29 |
[Spring] Spring Boot ํ๋ก์ ํธ ์์ฑํ๋ ๋ฐฉ๋ฒ (0) | 2020.12.14 |
[Spring] Spring boot Assert (0) | 2020.09.22 |
[Spring] Spring boot Project - ๋ ์คํ ๋ ์์ฝ ์ฌ์ดํธ ๋ง๋ค๊ธฐ (๋ค์ด๊ฐ๊ธฐ) (0) | 2020.09.20 |