[03-04.] Service 코드 파헤치기
@RequiredArgsConstructor // Repository 꼭 필요하다고 알려줌
@Service
public class MemoService {
private final MemoRepository memoRepository;
@Transactional
public Long update(Long id, MemoRequestDto requestDto) {
Memo memo = memoRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("아이디가 존재하지 않습니다.")
);
memo.update(requestDto); // Memo.java에 update 메소드 추가
return memo.getId(); // return id 라고 해도 됨
}
}
@RequiredArgsConstructor
final이 붙은 필드에 대한 생성자를 생성
@Transactional
메소드 동작이 SQL 쿼리문임을 선언
public 반환타입 메소드이름(재료) {
}
재료에는 어떤 것을 update 하는지 알기 위해서 id가 필요하고, 또 변경 시킬 내용에 대한 정보를 적으면 된다.
@Transactional
public Long update(Long id, MemoRequestDto requestDto) {
}
예외처리
@Transactional
public Long update(Long id, MemoRequestDto requestDto) {
Memo memo = memoRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("아이디가 존재하지 않습니다.")
);
}
new IllegalArgumentException() 이나 new NullPointerException() 둘 중에 아무거나 해도 상관없다.
new NullPointerException() -> 가리키는 값이 없음
new IllegalArgumentException -> 전달받는 재료가 잘못되었다.
@Transactional
public Long update(Long id, MemoRequestDto requestDto) {
Memo memo = memoRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("아이디가 존재하지 않습니다.")
);
memo.update(requestDto);
return memo.getId();
}
}
memo.update(requestDto); 👉🏻 Memo.java에 update 메소드 추가
// Memo.java
// update 기능 만들기
public void update(MemoRequestDto requestDto) {
this.username = requestDto.getUsername();
this.contents = requestDto.getContents();
}
@Transactional
public Long update(Long id, MemoRequestDto requestDto) {
Memo memo = memoRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("아이디가 존재하지 않습니다.")
);
memo.update(requestDto);
return memo.getId();
}
}
return memo.getId(); 👉🏻 id를 전달
id를 전달해주므로 반환 타입은 Long타입
@Transactional
public Long update(Long id, MemoRequestDto requestDto) {
}
Controller → Service or Repository ??
아래 코드를 보면 update를 하는 코드만 service로 넘겨주고 create, read, delete는 repo로 넘겨주었다.
@RequiredArgsConstructor
@RestController
public class MemoController {
// 필수적이므로 private final을 붙여준다.
private final MemoRepository memoRepository; // 나머지는 repo가 필요
private final MemoService memoService; // update를 위해서 서비스 필요
//create
@PostMapping("/api/memos")
public Memo createMemo(@RequestBody MemoRequestDto requestDto) {
Memo memo = new Memo(requestDto);
return memoRepository.save(memo);
}
//read
@GetMapping("/api/memos")
public List<Memo> getMemos() {
return memoRepository.findAllByOrderByModifiedAtDesc();
}
//update
@PutMapping("/api/memos/{id}")
public Long updateMemo(@PathVariable Long id, @RequestBody MemoRequestDto requestDto) {
memoService.update(id, requestDto);
return id;
}
//delete
@DeleteMapping("/api/memos/{id}") //PathVariable 경로에 있는 변수_중괄호
public Long deleteMemo(@PathVariable Long id) {
memoRepository.deleteById(id);
return id;
}
}
그런데 3차 프로젝트 작성했던 코드를 보면 모두 service로 넘겨줬다.
어느게 best일까?
→ 현업에서는 주로 service에서 repository를 사용한다.
그러므로 위 강의에서 적힌 코드보다는 3차 프로젝트 처럼 service로 넘겨준다.
내가 프로젝트에서 작성한 코드를 참고해본다.
@RequiredArgsConstructor
@RestController
public class RegistryController {
private final RegistryService registryService;
@PostMapping("/registry") //@RequestParam이 여러개 있다. -> @ModelAttribute
public Registry setUpload(@ModelAttribute RegistryDto uploadDto) throws IOException{
System.out.println(uploadDto.getImage().getOriginalFilename());
return registryService.setUpload(uploadDto);
}
//회원가입할 때 정보 가져오기
@GetMapping("/registry")
public Membership getMembership(@RequestBody MembershipDto membershipDto) throws IOException {
return registryService.getMembership(membershipDto);
}
}
crud에서 upadte만 service에서 담당하고
repo에서 update를 제외한 crud를 담당해서 위 코드처럼 작성한다 라고 기억하면 될듯 하다
출처)
@RequiredArgsConstructor를 통한 의존성 주입
'T.S.L > 스프링 입문' 카테고리의 다른 글
99일차(API) (0) | 2021.12.20 |
---|---|
96일차(스프링 웹 개발 기초) (0) | 2021.12.17 |
95일차 (MVC와 템플릿 엔진) (0) | 2021.12.16 |
94일차(라이브러리) (0) | 2021.12.16 |
92일차(Repository, DTO에서의 @Getter와 @Setter) (0) | 2021.12.14 |