๐ฉ๐ป Learn programming
[Spring] Spring ๊ตฌ์กฐ์ API ํ๋ฆ ์ดํดํ๊ธฐ1 (์คํ๋ฅดํ์ฝ๋ฉํด๋ฝ - ์น๊ฐ๋ฐ์ ๋ด, Spring 2์ฃผ์ฐจ)
๋ฐ๊ตฅ์
2022. 5. 25. 21:41
๋ฐ์ํ
{ โญ ๋ ์ ๋ฆฌ๋ ๋ ธ์ ๋ฒ์ โญ}
โSpring์ ๊ตฌ์กฐ
1.Controller : ๊ฐ์ฅ ๋ฐ๊นฅ ๋ถ๋ถ, ์์ฒญ/์๋ต์ ์ฒ๋ฆฌํจ.
2. Service : ์ค๊ฐ ๋ถ๋ถ, ์ค์ ์ค์ํ ์๋์ด ๋ง์ด ์ผ์ด๋๋ ๋ถ๋ถ
3. Repo : ๊ฐ์ฅ ์์ชฝ ๋ถ๋ถ, DB์ ๋ง๋ฟ์ ์์. (Repository, Entity) - ๊ฐ์์์๋ models
models - person.java
- lombok (import๋ ํด์ฃผ๊ธฐ)
- person ํด๋์ค์ @Getter ์ ์ฉ (๊ธฐ์กด getName, getJob…์ ๋์ฒดํจ)
- ์์ฑ์ ๋ง๋ค๊ธฐ
public Person(PersonRequestDto requestDto) {
this.name = requestDto.getName();
this.job = requestDto.getJob();
this.age = requestDto.getAge();
this.address = requestDto.getAddress();
}
models - PersonRequestDto.java
- PersonRequestDto.java ํด๋์ค ์์ฑ
import lombok.Getter;
@Getter
public class PersonRequestDto {
private String name;
private String job;
private int age;
private String address;
}
API
POST - ์์ฑ
- controller - PersonController.java
@PostMapping("/api/persons")
//ํฌ์คํธ ์์ฒญ์ด ์ฌ ๋ ํญ์ ์คํ๋๋ ๋ฉ์๋
public Person createPerson(@RequestBody PersonRequestDto requestDto) {
Person person = new Person(requestDto);
return **personRepository**.save(person);
}
- PersonRequestDto requestDto : ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์์ฌ(ํ๋ผ๋ฏธํฐ)
- @RequestBody : Request์ body ์์ญ์ ์๋ ๊ฒ ์ ๋๋ก ์ ๋ฌ๋๊ธฐ ์ํด ์ฌ์ฉ
- personRepository์ save๋ฅผ ์ฌ์ฉํด์ person ๊ฐ์ ์ ์ฅํด์ผํจ.
- (๐) But! personRepository ์์ง ์์ฑ ์๋จ
2. models - PersonRepository.java ์ธํฐํ์ด์ค ์์ฑ
- JPA๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ JpaRepository ์์์ ํด์ฃผ๋๋ฐ (extends JpaRepository)
- person์ ๋ํ ๊ฒ์ด๊ณ Long์ด ๋น ์ ธ์๋ค. (<Person, Long>)
public interface PersonRepository extends JpaRepository<Person, Long> {
}
3. models - person.java ํ์ผ
- @Entity (ํ ์ด๋ธ์์ ์๋ ค์ค), @NoArgsConstructor (๊ธฐ๋ณธ ์์ฑ์ ์์ฑํด์ฃผ๋ ๊ฒ) ์ Person ํด๋์ค์ ์ถ๊ฐ
- private key๋ฅผ ์์ฑํด์ฃผ๊ธฐ ์ํด์ Long ํ์ ์ Id ๋ง๋ค๊ธฐ
@GeneratedValue(strategy = GenerationType.AUTO)
// ์์ฑ ์ ๋ต์ด ์๋์ผ๋ก ์ฆ๊ฐ ๋ถ์ฌ
@Id
private Long id;
// ๊ฐ๊ฐ์ ์ปฌ๋ผ์ ๋ํด์ ์ง์ ํ๊ธฐ
// ์์ผ๋ฉด ์๋๋ค nullable = false
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String job;
@Column(nullable = false)
private int age;
@Column(nullable = false)
private String address;
4. ๋ค์ controller - PersonController.java
@RequiredArgsConstructor
//๊ถํ์ ์คํ
๋๊น ์คํ๋ง์๊ฒ ์์์ ์์ฑ์๋ฅผ ์์ฑํด์ฃผ๋ผ๊ณ ํ๋ ๊ฒ
@RestController
public class PersonController {
private final PersonRepository personRepository;
// PersonController ํ ๋ ๊ผญ ํ์ํ๊ฑฐ์ผ (final)
}
- @RequiredArgsConstructor : ‘๋๊ฐ PersonController ๊ฐ๋ค ์ฐ๋ ค๊ณ ํ ๋, ๋ฉค๋ฒ๋ก ์ ์ธ๋ ๊ฒ ์ค์ final๋ก ๋ ๊ฑฐ ์์ผ๋ฉด ์์์ ์์ฑํด์ค’ ๋ผ๊ณ ๊ถํ์ ๋๊ฒจ์ค
- (๐) ์ด๋ ๊ฒ personRepository ์์ฑ ํด์คฌ์!!
5. controller - PersonController.java ์์ api ์์ฑํ๊ธฐ
@PostMapping("/api/persons")
// ํฌ์คํธ ์์ฒญ์ด ์ฌ ๋ ํญ์ ์คํ๋๋ ๋ฉ์๋
public Person createPerson(@RequestBody PersonRequestDto requestDto) {
Person person = new Person(requestDto);
return personRepository.save(person);
}
- personRepository๋ฅผ return ํด์ฃผ๋ฉด ์์ฑํ๋ POST API๊ฐ ์์ฑ๋จ !
GET - ์กฐํ
- controller - PersonController.java
@GetMapping("/api/persons")
public List<Person> readPersons() {
return personRepository.findAll();
}
- personRepository๋ฅผ ์ด์ฉํด findAll์ ํด์ ๋ชจ๋ ์ฌ์ฉ์์ ๋ชฉ๋ก์ ๋๋ ค์ค
- ๋๋ฉ์ธ์ด ๊ฐ์๋ ์์ฒญ ๋ฐฉ์์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค. ์ต๊ณ ..
PUT - ์์
- controller - PersonController.java
@PutMapping("/api/persons/{id}")
public Long updatePerson(@PathVariable Long id, @RequestBody PersonRequestDto requestDto) {
}
- api ๋๋ฉ์ธ์ {id}๋ฅผ ์ถ๊ฐํด ์ด๋ค id์ ๊ฐ์ ์์ ํ ์ง ์๋ ค์ค์ผํจ
- ํ๋ผ๋ฏธํฐ ์ค์ !
- (Long id, PersonRequestDto requestDto) ๋ง ์์ฑํ๋ฉด ๋๋ฉ์ธ์ {id}์ ๋งค์นญ์ด ๋๋์ง, ์์ฒญ์ ๋ณด๋ด๋ body์ requestDto๊ฐ ๋งค์นญ์ด ๋๋์ง ์คํ๋ง์ด ์ ์ ์์!
- ๊ฐ ํ๋ผ๋ฏธํฐ์ @PathVariable (์ฃผ์), @RequestBody ๋ก ์๋ ค์ค์ผํจ! ํ์!
- Long id : ์ด๋ค id์ ๊ฐ์ ์์ ํ๋์ง ์ฃผ๋ ํ๋ผ๋ฏธํฐ
- PersonRequestDto requestDto : ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ํ๋ผ๋ฏธํฐ
- ์์ ์ ํ๊ธฐ ์ํด์๋ (1) id์ ํด๋นํ๋ person ๊ฐ์ ์ฐพ์์, (2) ๊ทธ๊ฒ์ ์ ๋ฐ์ดํธ ์์ผ์ค์ผํจ
(1) id์ ํด๋นํ๋ person ๊ฐ ์ฐพ๊ธฐ (personService์ ์ ์ฉํ ๊ฑฐ์ผ)
Person person = personRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("์์ด๋๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค.")
);
- orElseThrow( ) : ์์ ๋๋ ์ด๋ฐ ์ค๋ฅ๋ฅผ ์ผ์ผ์ผ์ ๋ํํ ์๋ ค์ค.
- (โ) ํ์ง๋ง, ์ด ์ฝ๋๋ฅผ controller์ PUT์์ ์ฒ๋ฆฌํ๋ฉด, service์ controller์ ์์ญ์ด ๊ฒน์น๊ฒ ๋จ.
(2) ์ ๋ฐ์ดํธ ํ๊ธฐ
@PutMapping("/api/persons/{id}")
public Long updatePerson(@PathVariable Long id, @RequestBody PersonRequestDto requestDto) {
return personService.update(id, requestDto);
}
- personService์ update ๋ฉ์๋์์ id๋ฅผ ๋ฐํํ๋ return ์ฝ๋ ์์ฑ.
- (๐คฉ) But! personService ์์ง ์์ฑ ์๋จ.
2. service - personService.java ํด๋์ค ์์ฑ
- (๐คฉ) personService ์์ฑํด์คฌ์!
@RequiredArgsConstructor
@Service //์๋น์ค๋ผ๊ณ ์๋ ค์ค์ผ ํจ.
public class PersonService {
private final PersonRepository personRepository;
@Transactional //์ด ๋ฉ์๋์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ๋์ ๋ฐ์ ๋ผ์ผ ํด
public Long update(Long id, PersonRequestDto requestDto) {
Person person = personRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("ํด๋น id๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค.")
);
}
}
- update ๋ฉ์๋๋ฅผ ๋ง๋๋๋ฐ id๋ฅผ ๋๋ ค์ค ๊ฑฐ๋๊น Long ํ์
- (โ) PUT 1 - (1) ์ฝ๋๋ฅผ ๋ถ์ฌ์ฃผ๊ธฐ
- ์ฆ, id ๊ฐ์ผ๋ก ํด๋นํ๋ person ๊ฐ ์ฐพ๋ ๊ณผ์ ์ ๋ถ์ฌ์ค.
- personRepository๋ฅผ ๋ฉค๋ฒ ๋ณ์๋ก ์ ์ธํ๊ณ (private final PersonRepository personRepository;)
- ๊ถํ ์ฃผ๊ธฐ (@RequiredArgsConstructor)
3. models - person.java ์์ update ๋ฉ์๋ ๋ง๋ค๊ธฐ
public void update(PersonRequestDto requestDto) {
this.name = requestDto.getName();
this.job = requestDto.getJob();
this.age = requestDto.getAge();
this.address = requestDto.getAddress();
}
- Person ๋ฉ์๋์ ๊ฐ์ ธ์ค๋ ๋ฐ์ดํฐ(ํ๋ผ๋ฏธํฐ)์ ํ๋ ์ผ๋ ๋๊ฐ์
- requestDto์์ name, job, age, address ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ๋ด๊ฐ ๊ฐ๊ณ ์๋ person์ ์ ๋ฐ์ดํธ ํจ.
4. service - personService.java
- service์ update ๋ฉ์๋ ์์ update ํด์ return ํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผ ํจ.
person.update(requestDto);
return person.getId();
5. controller - PersonController.java
@RequiredArgsConstructor
//๊ถํ์ ์คํ
๋๊น ์คํ๋ง์๊ฒ ์์์ ์์ฑ์๋ฅผ ์์ฑํด์ฃผ๋ผ๊ณ ํ๋ ๊ฒ
@RestController
public class PersonController {
private final PersonRepository personRepository;
private final PersonService personService;
//ํ์ํ๋ฉด ์ธ์ ๋ ์ง personService ์จ๋จน์ด~
}
- personService๋ฅผ ๋ฉค๋ฒ ๋ณ์๋ก ์ ์ธํ๊ณ personService์ ์ฌ์ฉ ๊ถํ์ ์ค.
DELETE - ์ญ์
- controller - PersonController.java
@DeleteMapping("/api/persons/{id}")
public Long deletePerson(@PathVariable Long id) {
personRepository.deleteById(id);
return id;
}
- api ๋๋ฉ์ธ์ {id}๋ฅผ ์ถ๊ฐํด ์ด๋ค id์ ๊ฐ์ ์ญ์ ํ ์ง ์๋ ค์ค์ผํจ, Id์ ํ์ ์ Long
- id๊ฐ์ ์ฐพ๊ธฐ ์ํด์ @PathVariable (์ฃผ์)
ํ๋ก๊ทธ๋จ run
- ํ๋ก์ ํธ ํ์ผ์ ์๋ HwkWeek01.Application.java
@EnableJpaAuditing
@SpringBootApplication
public class HwkWeek01Application {
public static void main(String[] args) {
SpringApplication.run(HwkWeek01Application.class, args);
}
}
- @EnableJpaAuditing : JPA๋ฅผ ์์ ๋กญ๊ฒ ์ธ ์ ์๊ฒ ํด์ค
๋ฐ์ํ