T.S.L/스프링 입문

93일차

haedal-uni 2021. 12. 14. 21:26
728x90

[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를 통한 의존성 주입

 

 

728x90

'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