본문 바로가기
오답노트

Follow기능을 시연하다가 오류를 발견했습니다..중복으로 데이터가 들어가네요...😿

by titlejjk 2023. 8. 24.

https://titlejjk.tistory.com/317

 

Follow 기능 구현

프로젝트를 진행중 Follow기능을 구현하기로해 공부한 내용을 적어본다. 사용한 기술 Java 11 MyBatis Spring Frame work 2.7.14 MariaDB IntelliJ Ultimate 나는 Backend 담당이여서 Back에 대한 코드밖에 제공하지 못

titlejjk.tistory.com

오늘 완료된줄 알고 올렸던 Follow기능입니다.

 

그냥 값이 들어가길래 " 아 돌아가는구나 " 하고 팀원들과 테스트를 돌려보던중에

row에 같은 값이 중복으로 들어가는 설계오류를 발견했습니다.

 

아래는 기존 데이터가 있는 상황에서 진행한 Postman입니다.

이렇게 되면 완벽한 설정오류이지요..

 

어떻게 해결해야할까..DB SQL로 해결할 수 있을까? 아니면 Java Service에서 해결해야하나 고민하던중 두가지 방법을 생각해 보았습니다.

 

데이터베이스 같은 경우에는 제약 조건을 만들어주는 생각을 해보았습니다.

follow 테이블에 중복 팔로우를 허용하지 않도록 제약조건을 걸어주기.

 

두번째 방법은 데이터베이스 제약조건 외에도 Java Service 계층에서 이미 팔로우한 사용자를 확인할 것인지.

 

먼저 데이터베이스 제약조건으로 생각해 보았습니다.

만들어둔 follow 테이블 에서 follower_email과 following_email의 조합을 unique 키로 묶어서 복합 유니크 인덱스를 생성할 것인지.

 

먼저 이미 테이블을 만들어둔 상태이니 수정하는 상황이라 치면 아래와 같습니다.

###MariaDB사용중입니다###

ALTER TABLE follows
ADD CONSTRAINT unique_follow UNIQUE (follower_email, following_email);

follows 테이블에 제약 조건을 추가해 unique_follow라는 제약 조건을 추가해주었습니다.

동일한 follower_eamil, following_email의 조합을 가진 두 개 이상의 행을 삽입할 수 없게 됩니다.

 

Java의 Service계층에서의 해결방법은 아래와 같이 생각해봤습니다.

 

로직에서의 중복 확인은 

간단하게 이미 팔로우한 사용자인지 확인 하면 되지 않을까 했습니다.

 

먼저 FollowMapper.xml에 팔로우 관계의 존재 여부를 확인하는 쿼리문을 작성해주었습니다.

<!-- 팔로우 관계의 존재 여부를 확인 -->
    <select id="countFollow" resultType="int">
        SELECT COUNT(*) FROM follows
        WHERE follower_email = #{followerEmail} AND following_email = #{followingEmail}
    </select>

오타주의 ㅠㅠ..

 

다음으로 FollowMapper Interface에 쿼리문을 연결해줄 추상 메서드를 적어주었습니다.

//팔로우 관계의 존재 여부를 확인
    int countFollow(String followerEmail, String followingEmail);

 

ServiceImpl Class에서는 아래와 같이 작성해주었습니다.

//사용자 팔로우
    @Override
    public void followUser(FollowDto followDto) {

        int count = followMapper.countFollow(followDto.getFollowerEmail(), followDto.getFollowingEmail());
        if (count > 0) {
            throw new AlreadyFollowedException("You have already followed this user.");
        }
            followMapper.insertFollow(followDto);
    }

당연한 기능이지만 사용자의 follow의 이메일이 중복되는지 여부를 확인하는 겁니다.

데이터베이스에 존재하는 row를 SELCT해서 이미 팔로우한 사용자를 다시 팔로우하려는 시도가 있는 경우 예외를 발생시키도록 구성해보았습니다.

팔로우 관계가 이미 존재하는 경우에 Count 가 0 이상일 경우 예외처리가 발생되도록 해보았습니다.

예외처리가 아주 잘되고 있는 것을 확인해보았습니다.

댓글