๋ฐ์ํ
{ โญ ๋ ์ ๋ฆฌ๋ ๋ ธ์ ๋ฒ์ โญ}
โAPI ์ค๊ณํ๊ธฐ (CRUD)
โ๏ธ Repository ๋ง๋ค๊ธฐ
- domain ํจํค์ง (Repo ์์ญ) ๋ง๋ค๊ธฐ
- domain - Memo.java ํด๋์ค ์์ฑ
package com.sparta.week03.domain;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@NoArgsConstructor // ๊ธฐ๋ณธ์์ฑ์๋ฅผ ๋ง๋ญ๋๋ค.
@Getter
@Entity // ํ
์ด๋ธ๊ณผ ์ฐ๊ณ๋จ์ ์คํ๋ง์๊ฒ ์๋ ค์ค๋๋ค.
public class Memo extends Timestamped { // ์์ฑ,์์ ์๊ฐ์ ์๋์ผ๋ก ๋ง๋ค์ด์ค๋๋ค.
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
private Long id;
@Column(nullable = false)
private String username;
@Column(nullable = false)
private String contents;
public Memo(String username, String contents) {
this.username = username;
this.contents = contents;
}
public Memo(MemoRequestDto requestDto) {
this.username = requestDto.getUsername();
this.contents = requestDto.getContents();
}
}
- lombok์ ์ด์ฉํด ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ๋ง๋๋ @NoArgsConstructor, Getter๋ฅผ ์์ฑํด์ฃผ๋ @Getter๋ฅผ ์ถ๊ฐ
- ํ ์ด๋ธ๊ณผ ์ด์ด์ง๋ ํ์ผ์ด๋ผ๋ ๊ฒ์ ์๋ ค์ฃผ๊ธฐ ์ํด @Entity๋ฅผ ์ถ๊ฐ
- ๋ฉ๋ชจ๋ 1) ์ต๋ช
์ ์์ฑ์ ์ด๋ฆ (username), 2) ๋ฉ๋ชจ ๋ด์ฉ (contents)๋ก ์ด๋ฃจ์ด์ง
- ๊ตฌ๋ณํด์ฃผ๋ ํค id๋ฅผ ์์ฑํ๊ณ , ์๋์ผ๋ก ์ฆ๊ฐํ๋๋ก *@GeneratedValue*(strategy = *GenerationType*.AUTO) ์ถ๊ฐ
- ํ์ฌ ์ํ : (๐ฅถ)Timestamped, (๐ค)MemoRequestDto ๊ฐ ์์ฑ๋์ง ์์๊ธฐ ๋๋ฌธ์ ์๋ฌ
3. domain - Timestemped.java ํด๋์ค ์์ฑ
@MappedSuperclass // Entity๊ฐ ์๋์ผ๋ก ์ปฌ๋ผ์ผ๋ก ์ธ์ํฉ๋๋ค.
@EntityListeners(AuditingEntityListener.class) // ์์ฑ/๋ณ๊ฒฝ ์๊ฐ์ ์๋์ผ๋ก ์
๋ฐ์ดํธํฉ๋๋ค.
public abstract class Timestamped {
@CreatedDate
private LocalDateTime createdAt; //์์ฑ์๊ฐ
@LastModifiedDate
private LocalDateTime modifiedAt; //์์ ์๊ฐ
}
- @MappedSuperclass : Timestamped๋ฅผ ์์ํ ํด๋์ค(์ด ํ๋ก์ ํธ์์๋ Memo.java)์ ์๋์ผ๋ก ์์ฑ ์๊ฐ๊ณผ ์์ ์๊ฐ์ colunm์ผ๋ก ์ธ์ํ๊ฒ ํจ.
- @EntityListeners : Entity(์ด ํ๋ก์ ํธ์์๋ Memo.java)๊ฐ ๋ณํํ๋ ๊ฒ์ ํญ์ ๋ฃ๊ณ ์๋ค๋ ๊ฒ.
- LocalDateTime : ์๊ฐ์ ๋ํ๋ด๋ ์๋ฃํ
- abstract ์ถ๊ฐํด์ ์ถ์ ํด๋์ค๋ก ๋ง๋ค์ด์ค์ผํจ.
- New Timestamped ๋ก ์ฌ์ฉํ ์ ์์,
- (๋นต ํ์ ์์ง๋ง ๋นต ๋ชป๋ง๋ค๊ณ , ์์์ด ๋์ด์ผ๋ง ๋ง๋ค ์ ์๋ ํด๋์ค๋ค)
- (๐ฅถ) Timestamped ํด๋์ค ๋ง๋ค์ด์ ์๋ฌ ํด๊ฒฐ!
4. domain - MemoRequestDto.java ํด๋์ค ์์ฑ
@Getter
public class MemoRequestDto {
private String username;
private String contents;
}
- RequestDto๋ ๊ณ์ธต๊ฐ ๋ฐ์ดํฐ ๊ตํ์ ์ํด ํ์ํ ์ ๋ณด(username, contents)๋ฅผ ๊ฐ์ง๊ณ ๋ค๋.
- private๋ก ์ค์ ํ๊ณ , ๊ฐ์ ธ์ค๊ธฐ ์ํด @Getter ์ถ๊ฐ
- (๐ค) MemoRequestDto ํด๋์ค ๋ง๋ค์ด์ ์๋ฌ ํด๊ฒฐ!
5. domain - MemoRepository.java ์ธํฐํ์ด์ค ์์ฑ
public interface MemoRepository extends JpaRepository<Memo, Long> {
List<Memo> findAllByOrderByModifiedAtDesc();
}
- (extends) MemoRepository๋ ๋ฏธ๋ฆฌ ์์ฑ๋ JpaRepository(findAll, delete, findById, sava …)๋ฅผ / Memo๋ผ๋ ํด๋์ค์ id๊ฐ Long์ธ ๊ฒ์ ๋ํด์ ๊ฐ์ ธ๋ค๊ฐ ์ธ๊ฑฐ์ผ
- findAllByOrderByModifiedAtDesc
- *๏ธโฃ JPA ๊ณต์ ํํ์ด์ง ๋ฌธ์ ์ฐธ๊ณ
- https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods
- findAll By OrderBy ModifiedAt Des
- ๋ค ์ฐพ์์ ์ ๋ ฌํด์ค ์์ ๋ ๋ ์ง ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์(์ต์ ์)
- ⇒ ๋ค ์ฐพ์์ ์์ ๋ ๋ ์ง ๊ธฐ์ค์ผ๋ก ์ต์ ์์ผ๋ก ์ ๋ ฌํด์ค
โ๏ธ Service ๋ง๋ค๊ธฐ
- service ํจํค์ง ์์ฑํ๊ธฐ
- service - MemoService.java ํด๋์ค ์์ฑ
@Service
public class MemoService {
@Transactional
public Long update(Long id, MemoRequestDto requestDto) {
Memo memo = memoRepository.findById(id).orElseThrow(
() -> new NullPointerException("์์ด๋๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค. ")
);
memo.update(requestDto);
return id;
}
- update ์ service ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ update ๋ฉ์๋๋ฅผ ์์ฑํด์ค.
- public ๋ฐํํ์ ๋ฉ์๋์ด๋ฆ(ํ๋ผ๋ฏธํฐ) { }
- id๋ฅผ ๊ฐ์ ธ์์ ํด๋นํ๋ id์ Dto๋ฅผ ๋ณ๊ฒฝํด์ค์ผํ๊ธฐ ๋๋ฌธ์ (Long id, MemoRequestDto requestDto)์ ํ๋ผ๋ฏธํฐ๋ก ์ค์
- return ํ๋ id์ ๋ฐํํ์ ์ธ Long
1) id๋ก ํด๋นํ๋ ๋ฉ๋ชจ ์ฐพ๊ธฐ
-
Memo memo = memoRepository.findById(id).orElseThrow( () -> new NullPointerException("์์ด๋๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค. ") );
- memoRepository์ findId๋ก id๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฐพ์ ๊ฑด๋ฐ, ๋ง์ฝ์ ์์ผ๋ฉด ์ค๋ฅ ๋ฐ์ ์์ผ์ค
- NullPointerException : ๊ฐ๋ฆฌํจ ๊ฒ ๋น์ด์์ผ๋ฉด ์์ธ ์ฒ๋ฆฌ ํด์ค
- IllegalArgumentException : Argument(ํ๋ผ๋ฏธํฐ)๊ฐ ๋ญ๊ฐ ์๋ชป๋์ผ๋ฉด ์์ธ์ฒ๋ฆฌ ํด์ค
- id๋ก ๋ฉ๋ชจ๋ฅผ ์ฐพ์๊ฑฐ๋ ์ค๋ฅ๋ฅผ ๋ณด๋์ผ๋ฉด memo์ ๋ฐํํด์ค.
- memoRepository์ findId๋ก id๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฐพ์ ๊ฑด๋ฐ, ๋ง์ฝ์ ์์ผ๋ฉด ์ค๋ฅ ๋ฐ์ ์์ผ์ค
2) update ํ๊ธฐ
-
memo.update(requestDto); return id;
- memo์ requestDto๋ฅผ update ํ๊ณ , id ๊ฐ์ผ๋ก ๋๊ฒจ์ค
3. domain - Memo.java ํด๋์ค์ update ๋ฉ์๋ ์ถ๊ฐํ๊ธฐ
public void update(MemoRequestDto requestDto) {
this.username = requestDto.getUsername();
this.contents = requestDto.getContents();
}
- MemoService์์ requestDto๋ฅผ ์ ๋ฌ๋ฐ๊ธฐ ๋๋ฌธ์ update ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ requestDto
- ๋ณ๊ฒฝํ ๊ฐ์ ์ค์ด๋๋ฅด๋ Dto์ ๊ฐ์ด Memo ์์ ์ ์ฅ๋จ.
4. MemoService.java ์์ฑ์ํค๊ธฐ
@RequiredArgsConstructor
@Service
public classMemoService{
private final MemoRepository memoRepository;
@Transactional
publicLongupdate(Longid,MemoRequestDtorequestDto) {
Memomemo = memoRepository.findById(id).orElseThrow(
() -> new NullPointerException("์์ด๋๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค. ")
);
memo.update(requestDto);
returnid;
}
}
- memoRepository ๊ผญ ํ์ํ๋๊น final ์ ์ด์ฃผ๊ธฐ
- @RequiredArgsConstructor : fianl์ด ์์ผ๋ฉด ์์์ ์์ฑ์๋ฅผ ๋ง๋ค์ด์ฃผ๋ ๊ถํ์ ์ค์ผํจ
- @Service : ์๋น์ค๋ผ๊ณ ์๋ ค์ฃผ๊ธฐ
- @Transactional : ์ ๋ฐ์ดํธ ํ ๋ DB์ ์ง์ง ๋ฐ์๋์ผํ๋ค๊ณ ์๋ ค์ค.
โ๏ธ Controller ๋ง๋ค๊ธฐ
- Controller ํจํค์ง ์์ฑํ๊ธฐ
- MemoController.java ํด๋์ค ์์ฑ
@RequiredArgsConstructor
@RestController
public classMemoController{
private final MemoRepository memoRepository;
private final MemoService memoService;
}
- MemoRepository๋ memoService ์ฌ์ฉํ๊ฑด๋ฐ ๊ผญ ํ์ํ๋๊น final ์ถ๊ฐํด์ค
- ์๋๋ ์์ฒญ์ด ๋ค์ด์ค๋ฉด new memoController ~ ๋ผ๊ณ ์์ฑ์ด ๋ ํ ์ฌ์ฉํด์ผํ๋๋ฐ, @RequiredArgsConstructor, @RestController ๋ฅผ ์ฌ์ฉํ๋ฉด ์คํ๋ง์ด ๊ทธ ์ญํ ์ ํด์ค.
POST - ์์ฑ
@PostMapping("/api/memos")
public Memo createMemo(@RequestBody MemoRequestDto requestDto) {
Memo memo = new Memo(requestDto);
return memoRepository.save(memo);
}
- requestDto๋ผ๋ ํ์ ์๋ก์ด ๋ฉ๋ชจ๋ฅผ ๋ง๋ค์ด์ memoRepository์ save๋ฅผ ํ์ฉํด์ ์ ์ฅ.
Get - ์กฐํ
@GetMapping("/api/memos")
public List<Memo> readMemo() {
return memoRepository.findAllByOrderByModifiedAtDesc();
}
- memoRepository์ ์๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ๋ ์ง ๊ธฐ์ค์ผ๋ก ์ต์ ์์ผ๋ก ์ ๋ ฌํด ๋ณด์ฌ์ค.
PUT - ๋ณ๊ฒฝ
@PutMapping("/api/memos/{id}")
public Long updateMemo(@PathVariable Long id, @RequestBody MemoRequestDto requestDto) {
memoService.update(id, requestDto);
return id;
}
- ๋ณ๊ฒฝํ ๋ฉ๋ชจ์ id๋ฅผ ๋ฐ์์ memoService๋ก ์ ๋ฐ์ดํธ ํ๊ณ ๋ค์ id๋ฅผ ๋๋ ค์ค
DELETE - ์ญ์
@DeleteMapping("/api/memo/{id}")
public Long deleteMemo(@PathVariable Long id) {
memoRepository.deleteById(id);
return id;
}
- ์ญ์ ํ ๋ฉ๋ชจ์ id๋ฅผ ๋ฐ์์ ์ญ์ ํ๊ณ id๋ฅผ ๋๋ ค์ค.
๋ฐ์ํ