๋ณธ ๊ธ์ Springboot์ Mysql + Jpa + Lombok ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์ฑํ ๊ธ์ ๋๋ค.
ํด๋น ๋ธ๋ก๊ทธ์ ์กด์ฌํ๋ ๋ชจ๋ Springboot + Jpa ๊ด๋ จ ๊ธ์ ์ด ๊ธ์ ์กด์ฌํ๋ ๋ด์ฉ์ ์ ์ ๋ก ํฉ๋๋ค.
์์
- Springboot Project ์์ฑ
- Gradle ์์กด์ฑ ์ถ๊ฐ
- application.properties ์ค์
- db table ์์ฑ
- Lombok ์ค์
- ์ฝ๋ ๊ตฌํ (model, controller, repository ๋ ํฌ์งํ ๋ฆฌ ์์ฑ)
- CRUD ํ ์คํธ
์์๋ IntelliJ IDE๊ฐ ๊น๋ ค์๋ค๋ ์ ์ ํ์ ์งํ๋๋ค.
Springboot Project ์์ฑ
์ฐ๋ฆฌ๋ Springboot ํ๋ก์ ํธ๋ฅผ ์ด์ฉํด์ JPA๋ฅผ ํ ์คํธํ ๊ฒ์ด๋ฏ๋ก Springboot ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ค.
์ง์ Springboot ํ์ด์ง์์ ์์ฑํ ์๋ ์์ง๋ง ์ฐ๋ฆฌ๋ IDE ์์ฒด์ Spring Initializer์ ํตํด์ ์์ฑํ๋ค.
์ค์ ์ ๊ฐ๋จํ๊ฒ
- Spring Web
- Mysql Driver
- Spring Data JPA
- Lombok
๋ง ์ถ๊ฐํด์ค๋ค.
๊ทธ๋ผ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ํ๋ก์ ํธ๊ฐ ๋ํ๋๊ฒ ๋๋ค.
Gradle ์์กด์ฑ ์ถ๊ฐ
Gradle์ ์์กด์ฑ์ ๊ด๋ฆฌํด์ฃผ๋ ๋๊ตฌ์ธ๋ฐ ์ฐ๋ฆฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์์ฑํ ์์ ์ ํ์ํ ์์กด์ฑ์ ๋ชจ๋ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ์ง๊ธ์ ๋ฑํ ์ค์ ํ ํ์ผ์ด ์์ง๋ง ์์ผ๋ก ํ์ํ ๋ชจ๋ ์์กด์ฑ์ ์ด build.gradle ํ์ผ์์ ์ถ๊ฐํ ์ ์๋ค.
ํน์ ๋ชจ๋ฅด๋ ์ค๋ฅธ์ชฝ gradle ํญ์์ reimport๋ฅผ ์์ผ์ค๋ค.
applictation.properties ํ์ผ ์ค์
applictation.properties์๋ ์ฝ๋์ ์ ์ฝ ์ฌํญ ๋ฐ database ์ค์ ๊ณผ JUnit ์ค์ , ๋ฑ๋ฑ ๋ค์ํ ์ค์ ์ Format์ผ๋ก ์ฌ์ฉ๋ ์ ์๋ค.
์ด๋ฒ์๋ ์ฐ๋ฆฐ Mysql๋ง ์ค์ ํ ๊ฒ์ด๋ฏ๋ก Mysql ์ค์ ์ ์ถ๊ฐํด์ฃผ๋๋ก ํ๋ค.
Mysql ์ค์ ์ ํ์ํ ๋ณ์๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
- spring.datasource.url : ๋ฐ์ดํฐ๋ฒ ์ด์ค url
- spring.datasource.username : ๋ฐ์ดํฐ๋ฒ ์ด์ค username ์๋ง default๋ก root๊ฐ ์ค์ ๋์ด์์ง ์์๊น ์ถ๋ค.
- spring.datasource.password : ๋ฐ์ดํฐ๋ฒ ์ด์ค password
- spring.datasource.driver-class-name : ๋๋ผ์ด๋ฒ ์ ๋ณด
๋๋จธ์ง๋ ํ์ ์ค์ ๊น์ง ์๋๊ณ ์์ผ๋ฉด ์ข์ ์ค์ ์ด๋ ํ์์ ๋ฐ๋ผ ๊ฒ์ํด์ ์ค์ ํ๊ธธ ๋ฐ๋๋ค.
DB ํ ์ด๋ธ ์ค์
์ด์ mysql workbench๋ก ๋ค์ด๊ฐ์ ํ ์ด๋ธ์ ๋ง๋ค์ด๋ณด์.
mysql workbench๊ฐ ์๋ค๋ฉด ๊ฐ๋จํ ๋ด์ฉ์ด๋ ๊ฒ๋จน์ง ๋ง๊ณ ๊ตฌ๊ธ๋ง ํด์ ๊น์๋ณด๋๋ก ํ์.
mysql workbench์์ ํ ์คํธ ์ฉ๋์ธ userํ ์ด๋ธ์ ๋ง๋ค์ด๋ณด์.
create table์์ User๋ผ๋ ์ด๋ฆ์ ํ ์ด๋ธ์ Id, username, password ๋ง ์ถ๊ฐํด๋ณด์.
Lombok ์ค์
๋กฌ๋ณต์ ์ฌ์ฉํ๊ธฐ ์ํด ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๊ณ ํ๊ฒฝ ์ค์ ์์ Enable Annotation Process๋ฅผ ์ฒดํฌํ๋๋ก ํ์.
๊ทธ๋ฆฌ๊ณ ํ๊ฒฝ์ค์ ์์ Enable Annotation Processing์ ์ฒดํฌํด์ฃผ์
์ด์ ํ๋ก์ ํธ ํ๊ฒฝ ์ค์ ์ ๋ํด์๋ ๋ชจ๋ ์ค๋น๊ฐ ๋๋ฌ๋ค.
Rest Api๋ฅผ ์์ฑํ๋ ์ผ๋ง ๋จ์๋ค!
์ฝ๋ ๊ตฌํ
๋ค์๊ณผ ๊ฐ์ด DemoApplication์ด ์กด์ฌํ๋ ๋๋ ํ ๋ฆฌ์ 3๊ฐ์ ํจํค์ง๋ฅผ ๋ง๋ค์ด ์ฃผ์.
controller.package
์ปจํธ๋กค๋ฌ๋ผ๊ณ ํ๋ ์๋ฒ์ ์ํธ๋ฆฌ ํฌ์ธํธ์ ์๋ ํฌ์ธํธ๋ฅผ ์์ฑํ ํด๋์ค์ด๋ค.
์ถํ์ JPA๋ฅผ ๋ ๋ฐฐ์ฐ๊ณ ์น ์๋ฒ ๊ตฌ์กฐ์ ๋ํด์ ๋ ๊ณต๋ถํ๋ฉด ์๊ฒ ์ง๋ง ํด๋น ์๋น์ค ๋ก์ง์ Service ํจํค์ง์์ ๊ด๋ฆฌํ ํด๋์ค๋ฅผ Autowiredํ์ฌ ์๋น์ค ๋ก์ง์ ์์ฑํ๋ค.
ํ์ง๋ง ์ฐ๋ฆฌ๋ ๊ฐ๋จํ CRUD ํ
์คํธ์ด๋ฏ๋ก ๋จ์ํ ์ปจํธ๋กค๋ฌ๋ง ์์ฑํด๋ณด๋๋ก ํ์.
UserController.class ์์ฑ
UserController๋ก ์ปจํธ๋กค๋ฌ๊ฐ ์ ๋์ํ๋์ง ํ ์คํธ๋ฅผ ํด๋ณด์.
UserController๋ฅผ controller ํจํค์ง ํ์์ ์์ฑํ๊ณ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์.
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@GetMapping("/get")
public String getTest() {
return "success";
}
}
-
RestController
์ผ๋ฐ์ ์ธ Controller์๋ ๋ค๋ฅด๊ฒ ๋์ํ๋ค. ํต์ฌ์ ์ฐ๋ฆฌ๊ฐ Controller๋ก ํ์ด์ง๋ฅผ returnํ๋๊ฒ ์๋๋ผ Data(JSON)์ returnํ๋ ๊ฒ์ด๋ค. ์ ํํ๋ ResponseBody๋ฅผ ๋ฐํํ์ง๋ง ํ์ฌ ์์ ์์ ์ฝ๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ค๊ณ ์๊ฐํด๋ ๋ฌด๋ฐฉํ๋ค.
-
@GetMapping("")
"" ์์ ๋ค์ด๊ฐ URL๋ก GET ์์ฒญ์ ๋ฐ์ ์ ์๊ฒ ํด์ฃผ๋ ์ด๋ ธํ ์ด์ ์ด๋ค. ์ด ์ด๋ ธํ ์ด์ ์ @RequestMapping์ get ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ๊ฒ๊ณผ ๊ฐ์ ์ญํ ์ ์ํํ๋ค.
๊ทธ๋ฆฌ๊ณ localhost:8080/get ์ด๋ผ๋ ๊ฒฝ๋ก๋ฅผ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด์ ๋ค์ด๊ฐ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฑ๊ณต์ ์ผ๋ก ๋์ํ ๊ฒ์ ์ ์ ์๋ค.
model.package
๋ฐ์ดํฐ ๊ด๋ จ Object๊ฐ ๋ค์ด๊ฐ ํจํค์ง ์ด๋ค.
์ด ๋ถ๋ถ๋ ์ถํ์ DAO, DTO, VO๋ก ๋๋ ์ ๊ด๋ฆฌํ๊ธฐ๋ ํ๊ณ DAO, DTO๋ก๋ ๊ด๋ฆฌํ๊ธฐ๋ ํ๋ค.
์ผ๋จ์ ์ฐ๋ฆฌ๋ ๋จ์ DAO ๊ฐ์ฒด๋ง ๋ง๋ค์ด๋ณด์.
์์ธํ ์ฌํญ์ ๊ตฌ๊ธ๋ง์ ํตํด ์์๋ณด๋ ๋ฐฉ๋ฒ๋ ์ข์ ํ์ต๋ฒ์ด๋ค.
User.class ์์ฑ
package com.example.demo.model;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
}
ํด๋น ํด๋์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ค์ ๋งค์นญ๋๋ ์ญํ ์ ํ๋ ํด๋์ค์ด๋ค.
-
@Entity
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ๋ ๊ฐ์ฒด๋ฅผ Entity๋ก ์ง์ ํ๋ค๋ ์ด๋ ธํ ์ด์ ์ด๋ค. ์ฐ๋ฆฌ๊ฐ Entity๋ก ๋ง๋ค์ด์ผ์ง Repository์์ Entity๋ฅผ ๊ฐ์ง๊ณ ์ฝ๊ฒ ์ฟผ๋ฆฌ๋ฌธ์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค.
-
@Data
๋กฌ๋ณต์ ์ด๋ ธํ ์ด์ ์ผ๋ก Getter๊ณผ Setter๋ฅผ ์ง์ ๊ตฌํํ์ง ์์๋ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ์ด๋ ธํ ์ด์ ์ด๋ค.
-
@Id
๋ฐ์ดํฐ๋ฒ ์ด์ค์ Primary Key์ ํด๋นํ๋ ์นผ๋ผ์ ์ง์ ํ๋ ์ด๋ ธํ ์ด์ ์ด๋ค. ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ์์ด๋๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋๋ค.
-
@GeneratedValue(strategy = GenerationType.IDENTITY)
Id์ ์คํธ๋ ํฐ์ง๋ฅผ ์ง์ ํ๋ ๊ฒ์ธ๋ฐ ์ฝ๊ฒ ๋ง ํด์ IDENETY๋ฅผ ์ค์ ํ๋ฉด DB์ AutoIncreament๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
repository.package
JPA๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฟผ๋ฆฌ๋ฌธ์ ORM์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ ํจํค์ง์ด๋ค.
์ฐ๋ฆฌ๋ JpaRepository๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ ๊ฒ์ด๋ค.
UserRepository.interface ์์ฑ
package com.example.demo.repository;
import com.example.demo.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
- JpaRepository<Entity, Type>
JpaRepository๋ก ์ฌ์ฉํ ์ ์๊ฒ ์ง์ ํด์ฃผ๋ ์ด๋ ธํ ์ด์ ์ผ๋ก ์ ๋ค๋ฆญ ํ์ ์์๋ Entity ํด๋์ค์ ํด๋น ํด๋์ค์ Id ํ์ ์ด ๋ค์ด๊ฐ๋ค.
CRUD ํ ์คํธ
Controller ์์ฑ
์ด์ ๋ชจ๋ ์ ์ ์ด ๋๋ฌ์ผ๋ฏ๋ก ๋ค์ Controller๋ก ๋์๊ฐ์ ์ค์ ํต์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ฝ๋๊ฐ ์ ๋์ํ๋์ง ํ์ธํด๋ณด์.
package com.example.demo.controller;
import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
@RestController
@RequestMapping("/api")
public class UserController {
@Autowired
private UserRepository userRepository;
@PostMapping("/user")
public User create(@RequestBody User user) {
return userRepository.save(user);
}
@GetMapping("/user/{id}")
public String read(@PathVariable Long id) {
Optional<User> userOptional = userRepository.findById(id);
userOptional.ifPresent(System.out::println);
return "successfully executed";
}
}
Api Tester๋ก ํ ์คํธ
create ๋ฉ์๋ ์คํ
create ๋ฉ์๋๋ Controller์์ ๋งคํํ๊ธธ localhost:8080/api/user ๋ก ํ์์ผ๋ฏ๋ก ํด๋น URL์ JSON ํ๋ผ๋ฏธํฐ๋ฅผ ๋๊ฒจ๋ณด์.
๊ฐ๋จํ๊ฒ ์ฌ๊ธฐ์ ๋ง ํ๋ JSON ํ๋ผ๋ฏธํฐ๋ ์ฐ๋ฆฌ๊ฐ RequestBody๋ก ๋ฐ๋ User์ ๊ฐ์ฒด์ธ Key:value ํํ๋ก ๊ฐ์ด ๋์ด์ค๋ ๊ฒ์ ๋ปํ๋ค.
JSON์ ์น ๊ฐ๋ฐ์ ํ ๋๋ ์ค์ํ ๋ด์ฉ์ค ํ๋์ด๋ฏ๋ก ๊ผญ๊ผญ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก๋ผ๋ ํ์ต์ ํด๋ณด๊ธธ ๊ถ์ฅํ๋ค.
์ ์์ ์ผ๋ก ์ ์คํ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
read ๋ฉ์๋ ์คํ
read๋ฉ์๋๋ Controller์์ ๋งคํ์ ํ๊ธธ localhost:8080/api/user/{id}๋ก ํ์์ผ๋ฏ๋ก ํด๋น URL๋ก ๋ค์ด๊ฐ๋ณด์.
์ ์์ ์ผ๋ก ์ ์คํ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๋ ๊ฒ ์ค๋์ IntelliJ์์ ์คํ๋ง๋ถํธ + ๋ฐ์ดํฐ๋ฒ ์ด์ค(Mysql) + ๋กฌ๋ณต์ ์ฐ๊ฒฐํ์ฌ ์น ํต์ ์ ๋ํด ๊ฐ์ ์ ์ผ๋ก ์์๋ณด์๋ค.
๊ธ์ ์ค๋ช ์๋ Spring์ ์ง์ ์ฅ๋ฒฝ์ ๋ฎ์ถ๊ธฐ ์ํ ๋ง์ ๋น์ฝ์ด ์กด์ฌํ๋๋ฐ, ์ด๋ ค์ด ๋ด์ฉ์ ๊พธ์คํ ๊ตฌ๊ธ๋ง์ ํตํด ์ฑ์๋๊ฐ๋ ํ์ต ๋ฐฉ๋ฒ์ ๊ถ์ฅํ๋ค.
ํ์ดํ !
๋๊ธ