2022.11.16 TIL

SUADI·2022년 11월 16일
0

TIL 시작.

[1] check 클래스의 isAuthor 메서드

{1} Check 클래스

코드 설명에 앞서 Check 클래스에 대해 설명해 보려고 한다.
api들마다 공통적으로 사용되는 로직, 예를 들면 회원인지 아닌지 확인하는 메서드라던가, 작성자인지 아닌지 확인하는 메서드 등을 따로 컴포넌트 등록을 해 놓은 Check라는 클래스에 정의해 놓는다. 그리고 해당 메서드가 필요한 곳에 의존성 주입을 한 후에 메서드를 사용하곤 한다. 이러한 방법을 현업에서도 사용한다고 멘토 님께서 말씀해 주셔서 잘 사용하고 있다.

{2} isAuthor 메서드

    public void isAuthor(Member member, Board board) {
        // 관리자 테이블 나눌건지 회의 후 수정해야 함
        if (board.getMember() != member) {
            throw new GlobalException(ErrorCode.UNAUTHORIZED_AUTHOR);
        }
    }

Check 클래스에 isAuthor 메서드를 정의해 놓았다. 처음에는 다음과 같이 해당 게시물 엔티티의 멤버 객체와 게시물에 접근하는 멤버 객체를 비교해서 다를 경우 예외를 던지도록 했다.

하지만 이 방법에는 치명적인 오류가 있다. 멤버 객체들을 비교할 경우, 참조 변수가 가지고 있는 값은 멤버 객체를 가르키고 있는 주소값일 뿐인데 각 주소값은 다를 수 밖에 없기 때문에 항상 예외를 던지게 된다.

이를 해결하기 위해 유저네임을 비교함으로써 수정, 삭제 등의 기능에 작성자 권한을 가질 수 있도록 했다.

    public void isAuthor(Member member, Board board) {
        // 관리자 테이블 나눌건지 회의 후 수정해야 함
        if (!board.getMember().getUsername().equals(member.getUsername())) {
            throw new GlobalException(ErrorCode.UNAUTHORIZED_AUTHOR);
        }
    }

[2] query did not return a unique result: 3

    Optional<Board> findByMember(Member member);

이 메서드는 boardRepository에 정의된 메서드로서 특정 멤버가 생성한 게시물을 조회하기 위한 메서드이다. 프로젝트에 사용된 코드는 아니지만 에러의 상황을 설명하기 위해 지난 커밋 내역에서 가져온 코드이다.

여기에도 치명적인 오류가 숨어있다. 너무 바보같이 특정 멤버가 여러개의 게시물을 만들 수 있다는 사실을 망각하고 Optional로 조회한 데이터를 받게 되었다. 리스트 형태의 데이터를 조회하기 위해 쿼리를 여러번 날리는데 정작 담을 그릇이 하나밖에 못받는 형태이기 때문에 다음과 같은 에러가 난 것이다.

이 메서드는 결국 사용 자체를 안하게 되었기 때문에 수정하지도 않았지만 만약 저 메서드를 수정해야 했다면 다음과 같이 수정을 해야 했을 것이다.

List<Board> findAllByMember(Member member);

[3] Hibernate: “Field ‘category’ doesn’t have a default value” SQLException

이 에러는 프런트 분들의 요구 사항을 로직에 반영하다가 생긴 오류이다. 어떤 요구사항이였냐면 Board 테이블에 category라는 column이 있었는데 이걸 제거해 달라는 요구였다. 기존에는 category 라는 column이 있었기 때문에 자바 코드에서만 category field를 제거해주면 될 줄 알았다. 하지만 위와 같은 에러가 떴다.

원인은 자바 코드에서는 category라는 field를 제거해주었지만 기존에 db에 저장되어 있던 Board 테이블에는 category 라는 컬럼이 남아있었기 때문에 엔티티의 field와 테이블의 column의 불일치로 일어난 에러였다. 테이블을 드랍해줌으로써 에러를 해결할 수 있었다.

경우에 따라서 모델이나 ORM은 데이터베이스의 변경사항이 정확하게 반영되지 않을 수 있다고 한다. 코드상의 오류나 정확히 파악할 수 있는 오류가 아니고 원인을 알 수 없는 오류의 경우에는 데이터베이스 또는 테이블을 다시 만들고 재실행을 하는 것도 해결책이 될 수 있다.

0개의 댓글

관련 채용 정보