내일배움캠프/TIL

[Spring_4기 본캠프] 프로젝트 주간 - 트러블 슈팅 1 | Day 48

austindynasty 2024. 12. 23. 23:26

  뉴스피드 만들기 팀 프로젝트를 시작한 후 팔로우 관계를 구현하는 역할을 맡게 되었다. 팔로우 관계라는 것 자체가 간단하게 생각하면 팔로우하는 사람과 팔로우를 받는 사람으로 나뉘지만 비즈니스 로직으로 이를 구현하려니 계속 개념이 헷갈려서 트러블 슈팅을 하면서 헷갈리는 개념을 글로 정리하고자 한다. 

 

◆ 트러블 슈팅

 

1. 에러명 Application Run Failed 

 

<상황>

기능을 구현하기 전에 빌드를 하기 위해 애플리케이션을 실행했는데 Access 가 Denied되었다는 에러가 뜨면서 빌드가 되질 않았다.

MySQL WorkBench에서도 접속이 불가능하고, 비밀번호가 틀렸다는 오류창이 떴다. 하지만 나는 비밀번호를 바꾼 적이 없고 어제까지만 해도 잘 연결되던 MySQL이 갑자기 접속이 불가능하다고 해서 당황했다.

 

<원인>

내 프로젝트에서는 application.properties 였던 것을 다른 팀원이 쓰던 yml을 깃 클론 해 내려받는 중 형태가 바뀌면서 내 데이터베이스에 해당 데이터가 덮어씌워진 듯했다. 

 

<해결>

명령프롬프트로 강제 종료 후 재실행, 비밀번호 변경 등 인터넷에 나와있는 모든 걸 시도해봤지만 명확한 원인도, 해결법도 없었다. 결국 원래 있던 MySQL을 설치파일까지 모두 삭제한 후 재설치 했다. 해결을 못한 것이다. 비밀번호를 계속 틀리면 MySQL에서 계정을 잠궈버린다는 얘기를 본 적이 있는데 아마 후반에는 이러한 이유 때문에 계정이 차단되지 않았을까 싶다. 

정확한 원인도, 해결법도 찾지 못했지만 propertis를 yml 로 바꾸고 사용하는 법을 알았다. 확실히 properties보다 직관적이어서 보기에는 좋더라.. 

 

2. Column 'status' cannot be null

 

 

<상황>

팔로우하기 기능(팔로우 생성)을 구현한 후 첫 실행을 했을 때 status 가 null이면 안된다는 에러가 발생했다. 하지만 FollowRelationship 테이블에 있는 status에는 ACTIVE라는 값이 들어가 있었다. 왜 null이라고 하는걸까?

<원인>

FollowRelationship Entity 에 들어가보니 status 필드가 존재하지 않았다. BaseEntity에 있는 status를 상속받아 생성은 되지만 실질적으로 FollowRelationship의 status는 아무 값도 들어가지 않아 계속 null값이라고 인식되는 것이었다.

 

<해결>

두 가지 해결법이 있었는데, 하나는 status필드를 FollowRelationship에 추가해주는 것과 다른 하나는 BaseEntity에 있는 status 컬럼 자체를 FollowRelationship으로 옮기는 것이었다. BaseEntity를 만들었던 팀원분께 여쭤보니 BaseEntity에 status 컬럼을 넣고 각 entity들이 상속을 받게 한 이유는 entity마다 status가 필요한 상황이 있기 때문이라고 하셨다. 로그인 상태, 로그아웃 상태, 회원가입 상태, 탈퇴 상태 등등.. 

FollowRelationship 에서는 팔로우 상태, 언팔로우 상태를 나타내기 위해 status 컬럼이 필요했다. 하지만 내가 생각했을 때 모든 status가 이름이 status인 것은 맞지만 각 entity마다 뜻하는 status가 다르기 때문에 각자의 역할에 맞는 status로써 활용하기 위해 entity마다 넣어주는 것이 낫다고 판단했다. FollowRelationship Entity만 봤을 때 status가 없으면 BaseEntity까지 가서 있는 것을 확인해야 하니 다소 직관적이지 않다는 생각이 들었기 때문이다. 

FollowRelationship Entity에 status 컬럼을 추가해주고 POSTMAN을 재실행해 정상적으로 작동하는 것을 확인했다.

 

◆ 정리

1) MySQL Access Denied 에러 

해결 : 원인불명, 해결법불명으로 MySQL 완전 삭제 후 재설치 해 접속

2) Column status cannot be null 에러

해결 : BaseEntity에 있던 status 필드를 FollowRelationship 에 옮겨 실행 후 정상 작동 확인


◆ 개념과 관계 정리

 

1. FollowRelationship

- 팔로우를 거는 대상 = User follower (user_id) 

- 팔로우를 받는 대상 = User following (friend_id) 

 

2. findAllByFriend(User following) : 나를 팔로우 하고 있는 친구의 목록 

예시) friend id가 2인 팔로우 관계를 갖고온다.

철수(id 100) -> 수진(id 2) // user 100 friend 2

영희(id 13) -> 수진 (id 2) // user 12 friend 2

만수(id 49) -> 수진 (id 2) // user 49 friend 2

 

3. findAllByUser(User follower) : 내가 팔로잉 하고 있는 친구의 목록 

예시) user id가 2인 팔로우 관계를 갖고온다.

수진(id 2) -> 철수(id 100) // user 2 friend 100

수진(id 2) -> 영희(id 12) // user 2 friend 12
수진(id 2) -> 만수(id 49) // user 2 friend 49