TIL-Spring을 활용한 메모장 구현(25.03.21)
메모장 요구사항
- Local 환경에서 메모장에 게시글 작성하기 / 게시글 조회하기 / 게시글 수정하기 / 게시글 삭제하기 기능 구현
- 1차 실습은 Controller(MemoController) / entity(Memo) / dto (MemoRequestDto&MemoResponseDto)의 세 구조로 나누어 진행. Controller에서 입력을 받고 Dto로 변환하고, 출력하는 것까지 모두 수행하는 구조.
- Memo는 입력 데이터의 양식을 정함. 속성으로 이런 양식을 갖고 있음. 이 속성을 변화시키는 메서드(update/updateTitle)를 정의함
- MemoRequestDto는 입력 데이터와 동일한 속성을 가짐 (서버가 알아듣는 언어로 변환하는 역할)
- MemoResponseDto는 입력 데이터에 메모 번호까지 속성으로 가짐.
- MemoController에서 작성(POSTMAPPING) / 조회(GETMAPPING("/{id}") / 수정(PUTMAPPING("/{id}")) / 제목수정(PATCHMAPPING("/{id}") / 삭제(DELETEMAPPING("/{id}")) 메서드 구현
- MAPPING에 PATHVARIABLE이 있는 경우 메서드에 PathVariable을 정의해주어야 함.
- memoList를 정의해줌. private final Map< Long, Memo > memoList = new HashMap<>();과 같이
- Controller에서 Mapping과, 비즈니스 로직(생성/조회/수정/삭제)까지 담당하고 있어, Controller가 무거워짐 -> 분리 실습 진행
메모장 개선
- Controller 역할 분해하기
- Controller는 Mapping만 시켜주고, 비즈니스 로직은 각 영역에서 진행하기
- 기존의 controller / entity / dto 구조를 controller / entity / dto / service / repository로 구분
- service 에서 비즈니스 로직 수행
- repository에서 데이터 저장 / 조회
- entity에서 기본 속성 정의
- dto에서 entity 입력 값 변환 / 출력 값 변환 수행
- 이렇게 역할을 쪼갬
- controller
- MemoService를 속성으로 가짐 / 실행 시 MemoService 생성
- PostMapping / GetMapping / GetMapping("/{id}") / PutMapping("/{id}") / PatchMapping("/{id}") / DeleteMapping("/{id}") 메서드 생성
- 메서드 생성 시 ResponseEntity<>(memoService.메서드 ..)로 메서드 결과 반환(return)해 전달
- dto
- MemoRequestDto: 입력 entity를 MemoRequestDto로 변환
- MemoResponseDto: 출력을 dto 형태로 변환. MemoResponseDto(Memo memo) 생성자. this.id = memo.getId(); / this.title = memo.getTitle() / this.contents = memo.getContents();와 같이 memo를 받아 id / title / contents를 각각 나누어 설정
- entity
- 메모 양식. update 메서드 정의. update(String title, String contents) -> this.title = title / this.contents = contents와 같이 정의) 생성자는 title과 contents. 번호는 생성과 메모 관리는 repository에서 진행
- Repository
- 저장소. 인터페이스를 설정해 메서드를 정의해주고, JavaClass에서 인터페이스의 메서드를 구현
- saveMemo / findAllMemos / findMemoById / deleteMemo 메서드
- JavaClass에서 memoList 생성. Map< Long, Memo> memoList = new HashMapM<>();
- saveMemo로 memoList에 memoId 부여하고, memo를 입력받아 넣어주는 메서드
- findAllmemos는 memoList 안의 memo를 responseDto로 바꿔 List에 넣어주고 이 리스트를 반환
- findMemoById(Long id)는 id를 입력으로 받아, memoList에서 key가 id인 값을 반환
- deleteMemo(Long id)는 id를 입력으로 받아, memoList에서 key가 id인 값을 삭제
- memoService ... controller에서 매칭한 Post / Get / Put / Patch / Delete Mapping을 실제 수행하는 메서드들을 정의
- 인터페이스로 메서드들을 정의. SaveMemo / findAllMemos / findMemoById / updateMemo / updateTitle / deleteMemo
- SaveMemo와 findAllMemos, findMemoById, deleteMemo는 MemoRepository에도 있던 메서드인데, 다른점은, repository에서는 memo를 찾아주고, memoService에서는 찾은 memo를 MemoResponseDto로 변환해 반환해줌.
- Repository의 반환값은 memoList안에 있는 특정 memo / memoService의 반환값은 이 메모를 받아 실제 수행한 MemoResponseDto !
- 구조는 이렇게 이해했는데, 실제로 짜보라고 하면 아직 막막하다. 여기까지의 내용을 먼저 혼자 복습해보고 다음 DB로 넘어갈지, DB까지 들어볼지 고민된다. 일단은 여기까지. 어렴풋이 감이 잡히는 느낌이다. 실습에서는 RequestParam ModelAttribute HttpServletRequest/Response 이런 개념들을 모두 사용하지 않고, 자주 쓰는 개념 (@RequestBody @ResponseBody ResponseEntity @PathVariable 등)만 사용해서 그런가. 좀 연습 해보면 구조가 더 선명해질 것 같다.