## 작성한 코드
- **친구 추가 링크 생성 및 반환 API** 컨트롤러 계층 코드 및 테스트 코드 작성 완료
- **친구 추가 페이지 반환 API** 컨트롤러 계층 코드 및 테스트 코드 작성 완료
- **친구추가 수락상태 업데이트 API** 컨트롤러 계층 코드 및 테스트 코드 작성 완료
- **친구목록 조회 API** 컨트롤러 계층 코드 및 테스트 코드 작성 완료
- 위 모든 API에 대해 **Swagger API 명세** 완료
## 확인해야할 사항
- **TDD(Test Driven Development)** 개발 방식으로 코드 작성하여 테스트 코드를 먼저 작성하고 프로덕션 코드를 작성해(RED-GREEN-REFACTOR) **엣지 케이스**를 충분히 고려하여 작성하였음.
- 친구 추가 링크를 통해 친구추가 하는 방식에는 아래의 두 가지 방법이 있으나 **일단은 1번 방식으로 구현**하였음. 친구 추가 링크 생성 및 반환 API를 통해 반환받은 UUID로 FE에서 링크를 구성하고 복사를 하면, 해당 링크는 친구 추가를 하려는 대상 1명에게만 유효함. 누군가 해당 링크를 클릭하면 그 링크는 더 이상 사용할 수 없게 됨.
1. 친구추가 하고자하는 대상 1명에게만 사용 가능
2. 친구추가 하고자하는 대상 여러명에게 사용 가능
- 차후 기획단에서 2번 방식을 명확히 요구하면 코드 수정이 필요해보임
- API 명세서의 **2. 친구 추가 페이지 반환 API**는 GET메소드를 사용하는데, 비즈니스레이어에서 데이터를 변경함. 이 부분 차후 리팩토링이 필요해보임.
- 링크 복사 외에 **카카오톡으로 바로 초대** 기능도 구현해야 함
## 친구 추가 기능 API 명세서
### 1. 친구 추가 링크 생성 및 반환 API (**POST** /friends/link/create)###
- 친구관계를 의미하는 **FriendShip테이블의 데이터를 생성**하고 **해당 데이터의 PK를 반환**하는 API
- 본 API를 호출하면 FriendShip테이블의 데이터를 생성하고 PK인 **UUID를 반환하는데 FE에서 이 UUID를 이용해 _2. 친구 추가 페이지 반환 API_와 _3. 친구추가 수락상태 업데이트 API_를 호출할 수 있음.**
- 사용자가 '친구추가 링크 생성하기' 버튼을 누르면 호출하면 됨.
> **POST** /friends/link/create
> **요청헤더**: 엑세스토큰 //FriendShip 테이블의 친구추가 요청자 id를 세팅하기 위함.
> **요청바디**: -
>
> **반환바디**: friendShipId(데이터타입: UUID)
### 2. 친구 추가 요청자 조회 API (**GET** /friends/add-requester/{uuid}) ###
- 조회하려는 FriendShip 데이터의 **수신자 id를 세팅**하고 **요청자 정보를 반환**하는 API
- 본 API를 호출하면 쿼리파라미터의 UUID를 바탕으로 **FriendShip 데이터를 조회한 뒤, 해당 데이터의 수신자 id를 설정하고 요청자의 id, 이름, 이메일을 반환함.**
- **사용자가 딥링크를 클릭해 "~~님이 친구추가를 요청하셨습니다"라는 페이지를 반환해야할 때 호출하면 됨.**
> **GET** /friends/add-requester/{uuid}
> **요청헤더**: 엑세스토큰 //FriendShip 테이블의 친구추가 수신자 id를 세팅하기 위함.
> **요청바디**: -
>
> **반환바디**: requesterId(데이터타입: Long)
requesterName(데이터타입: String)
requesterEmail(데이터타입: String)
### 3. 친구추가 수락상태 업데이트 API (**POST** /friends/update-status/{uuid}) ###
- FriendShip 데이터의 **수락상태를 업데이트**하는 API
- 본 API를 호출하면 요청바디의 acceptStatus를 바탕으로 **FriendShip 데이터의 수락상태를 변경**함.("PENDING" -> "ACCEPTED" 또는 "REJECTED")
- **사용자가 "~~님이 친구추가를 요청하셨습니다"페이지에서 수락하기 또는 거절하기 버튼을 눌렀을 때 호출하면 됨.**
> **POST** /friends/update-status/{uuid}
> **요청헤더**: 엑세스토큰
> **요청바디**: acceptStatus // 값으로 **"ACCEPTED" 또는 "REJECTED"만 가능**함
>
> **반환바디**: -
### 4. 친구목록 조회 API (**GET** /friends/list) ###
- 호출한 사용자의 **친구 목록을 반환**하는 API
- 본 API를 호출하면 엑세스토큰의 사용자 정보를 바탕으로 FriendShip테이블에서 수신자/요청자ID를 매칭하고 수락여부가 **'ACCEPTED'**인 데이터를 찾아서 상대방 ID, 이름, 이메일을 조회 및 반환함.
- **사용자의 친구목록을 불러와야할 때 호출하면 됨.**
> **GET** /friends/list
> **요청헤더**: 엑세스토큰
> **요청바디**: -
>
> **반환바디**: {
friendId(데이터타입: Long)
friendName(데이터타입: String)
friendEmail(데이터타입: String)
}
의 **리스트**
## 코드를 작성하며 생긴 이슈 & 학습한 내용
#### API 설계 ####
- 친구추가 API들을 구현할 때 API명세서를 먼저 작성하고 코드를 작성하였는데 API 명세서가 자연어로 코드의 흐름을 문서화했을 때의 기능을 해 코드를 작성하는 중간중간 API 명세서를 참고하면서 큰 흐름을 파악할 수 있어 편했음.
- 미리 큰 틀을 자연어로 작성했음에도 불구하고 코드를 다 작성하고 테스트를 하는 과정에서 링크 친구추가 방법에는 아래 2가지 케이스가 있음을 깨달았음.
> 1. 친구추가 하고자하는 대상 1명에게만 사용 가능
> 2. 친구추가 하고자하는 대상 여러명에게 사용 가능
- API를 설계(명세서 작성)할 때 조금 더 치밀하게 생각할 필요가 있어보임.
#### TDD ####
- 지금까지 구현한 API들에 대해 테스트 코드를 작성하기 위해 테스트 코드를 공부하면서 테스트 코드의 철학에 대해 이해할 수 있었고 **TDD개발방식**에 관심을 가지게 되었음. TDD개발방식은 기능 개발보다 테스트를 먼저하는 개발 방식으로, **엣지 케이스**를 놓치지 않고 테스트 코드를 작성할 수 있게 해주며 프로덕션 코드를 유연하며 유지보수가 쉬운 즉, **테스트 가능한 코드**로 구현할 수 있께 해준다는 장점이 있음. 또한 구현에 대한 **빠른 피드백**이 가능해져 **과감한 리팩토링**이 가능함. 이를 친구추가 API 구현에 적용해 TDD의 장점을 느낄 수 있었음.
- **@DisplayName** 애너테이션을 통해 테스트 코드를 프로덕션 기능을 설명하는 **문서로서의 역할**을 할 수 있게끔 하였음.
## 전체 테스트 결과
[Test Results — ontime-back [test].pdf](https://github.com/user-attachments/files/18560965/Test.Results.ontime-back.test.pdf)
'웹개발 > Devkor-Ontime' 카테고리의 다른 글
[Devkor-Ontime][트러블슈팅] 유저계정삭제 API 호출시 외래키 제약조건으로 인한 오류 해결 (500 Internel 서버 에러) (0) | 2025.02.13 |
---|---|
[Devkor-Ontime] 성실도 관련 기능 구현 (0) | 2024.11.15 |
[Devkor-Ontime] 알림 스케줄러 구현 (0) | 2024.11.15 |
[Devkor-Ontime] JWT 일반로그인 구현 (0) | 2024.11.03 |