스프링 첫 개인과제 발제.
기본적인 CRUD이다. 문제를 보자마자 어떻게 설계를 해야할까? 먼저 떠올랐다. 그전 팀플을 하면서 다른 팀원들이 설계에 공을 들이는 것을 보고 이번에도 설계에 공을 들였다. 필수 구현과제는 다음과 같다.
- [ ] 게시글 작성 기능
- 제목, 작성자명, 비밀번호, 작성 내용, 작성일을 저장할 수 있습니다.
- 저장된 게시글의 정보를 반환 받아 확인할 수 있습니다.
- 반환 받은 게시글의 정보에 비밀번호는 제외 되어있습니다.
- [ ] 선택한 게시글 조회 기능
- 선택한 게시글의 정보를 조회할 수 있습니다.
- 반환 받은 게시글의 정보에 비밀번호는 제외 되어있습니다.
- 선택한 게시글의 정보를 조회할 수 있습니다.
- [ ] 게시글 목록 조회 기능
- 등록된 게시글 전체를 조회할 수 있습니다.
- 반환 받은 게시글의 정보에 비밀번호는 제외 되어있습니다.
- 조회된 게시글 목록은 작성일 기준 내림차순으로 정렬 되어있습니다.
- 등록된 게시글 전체를 조회할 수 있습니다.
- [ ] 선택한 게시글 수정 기능
- 선택한 게시글의 제목, 작성자명, 작성 내용을 수정할 수 있습니다.
- 서버에 게시글 수정을 요청할 때 비밀번호를 함께 전달합니다.
- 선택한 게시글의 비밀번호와 요청할 때 함께 보낸 비밀번호가 일치할 경우에만 수정이 가능합니다.
- 수정된 게시글의 정보를 반환 받아 확인할 수 있습니다.
- 반환 받은 게시글의 정보에 비밀번호는 제외 되어있습니다.
- 선택한 게시글의 제목, 작성자명, 작성 내용을 수정할 수 있습니다.
- [ ] 선택한 게시글 삭제 기능
- 선택한 게시글을 삭제할 수 있습니다.
- 서버에 게시글 삭제를 요청할 때 비밀번호를 함께 전달합니다.
- 선택한 게시글의 비밀번호와 요청할 때 함께 보낸 비밀번호가 일치할 경우에만 삭제가 가능합니다.
- 선택한 게시글을 삭제할 수 있습니다.
문제만 보면 항상 그랬듯 너무 간단해 보이고 머리속에는 쉭쉭 이렇게 이렇게 짜면 되겠는데? 생각을 했다.
본격적으로 설계에 돌입한 순간 정말 충격적이게도 절망적이였다. "이거 입력 어떻게 받아?" " 응답된 데이터들 어떻게 보여줘야 되지?"부터 "API설계 이론적으론 이해했는데 이거 어떻게 하더라?", "데이터베이스에 스프링 연동 어떻게 하는거였지?"까지 정말 막막하기 그지 없었다.(사실 현재진행형이다. 어디부터 시작해야할지도 조금 막막하다)아직 스프링을 혼자 다뤄본적이 없어서 문법도 익숙하지 않거니와, 스프링에서 제공하는 다양한 어노테이션, JDBC, HTTP까지 이론적으론 이해했다고 생각했는데 막상 혼자 적용하려니 손이 떨어지지 않았다. 다시 처음부터 시작한다는 마음으로 설계를 시작했다. 우선 usecase를 설계했다.
사실 이렇게 만드는거 아닌거 같은데.. 일단 이렇게 구성했다. 너무 절차지향적인 유즈케이스다. 하지만 유즈케이스에만 시간을 너무 뺏겼기 때문에 여기서 더 머물수 없어 우선은 이렇게 진행했다. 또한 ERD를 구성했다. 사실 ERD라고 하기엔 민망한 수준으로 짧지만 그래도 있는게 낫다.
메모장이 가져야할 엔티티느 간단하다. MEMO객체와 UESER객체. USER 객체가 있어야 할까?도 고민했지만 그래도 한유저가 만든 데이터는 묶어서 관리하는게 좋을듯하여 user_id를 fk를 갖도록 MEMO를 설계했다. 사실 필수사항에 한 유저가 작성한 메모를 가져와야할 기능은 없어서 USER객체를 없애도 상관이 없을것 같지만, 그래도 두 테이블을 같이 사용해보자.
그다음은 3Layer-Architecture를 이용하여 Controller, Service, Repository클래스를 구분하여 설계했다. 배운 것 처럼 Controller 클래스에는 클라이언트와 소통하며 적절한 api를 Service에게 넘겨준다. 이후 넘겨받은 데이터들을 클라이언트에게 Response하도록 했다. Controller의 기능은 클라이언트의 요청을 구분지어 Service 객체에 넘겨주기! 그리고 Service로 부터 결과를 받아온 데이터를 클라이언트에게 응답하기. 다음은 Service 클래스다. Service 클래스에선 넘겨받은 요청에 맞춰 Repository 클래스와 소통한다. DB에 조회할 기능이 필요할 땐 Repository 객체를 호출하여 DB를 호출하여 값을 얻어온다. 또한 글을 등록/수정할 때는 Entity에 정보를 담아 Repository에 넘겨준다. Repository는 DB와 소통하며 SQL 쿼리문을 이용해 DB에 저장/조회를 한다.
이때 각각의 기능들을 호출할 API명세서를 작성해 봤다. 이렇게 하는게 맞나.. 싶긴 하다.
기능 | RestAPI | 메서드 | 입력 데이터 | 반환 데이터 |
게시물 작성 | /memo | POST | 사용자 이름, 메모 제목, 메모 내용, 비밀번호 | 사용자 이름, 메모 제목, 메모 내용,메모 id, 날짜 |
선택 게시물 조회 | /memo/{id} | GET | 메모 id | 사용자 이름, 메모 제목, 메모 내용,메모 id, 날짜 |
게시물 목록 조회 | /memo | GET | 메모 제목, 메모 id, 메모 날짜 | |
선택 게시물 수정 | /memo/{id} | PUT | 메모 id, 비밀번호, 사용자 이름, 메모 제목, 메모 내용 |
(수정된) 사용자 이름, 메모 제목, 메모 내용,메모 id, 날짜 |
선택 게시물 삭제 | /memo/{id} | DELETE | 메모 id, 비밀번호 | - |
참 처음 하는걸 해보려니 이게 맞나 싶은 부분이 많지만 그래도 나름 공부하고 짰으니 맞지 않을까.. 생각해본다.
오늘 드디어 스프링의 본격적인 과제를 시작했다. 오늘은 알고리즘도 못풀었다.. 요즘 프로그래머스 1단계를 하루에 5문제씩 1시간 정도 할애해서 풀고 있는데 오늘은 정말 정신없이 시간이 지나갔다. 지금 알고리즘을 풀 에너지가 남지 않아 오늘은 2문제만 풀고 자야겠다.. 시간이 그렇게 많지 않으니 좀 더 서두르자.
당장 해결해야 할 문제는 1) 입력을 어떻게 받는지 공부하기 2) 아직 서버와 데이터베이스등 연동하는 방식을 잘 이해하지 못함 3) 서비스 클래스의 메서드들 기능구현하기 4) 레파지토리 클래스 DB와 어떻게 소통하는지(JDBC) 공부
정말 갈길이 멀다!