equals를 써야하는 이유

Sol's·2023년 1월 4일
0

오류

목록 보기
6/18

프로젝트를 진행하는중 댓글 수정기능을 만들었다.
수정은 작성한 사용자만 가능하고, 작성한 사용자가 아니라면 "사용자 권한이 없습니다."라는 에러를 리턴하게 하였다.

그런데 분명 댓글을 작성한 아이디로 로그인을 하고 댓글수정을 하였는데 에러가 발생하였다.
아래는 에러가 발생한 코드와 에러 내용이다.

if (comment.getUser().getUserName() != userName){
            throw new AppException(ErrorCode.INVALID_PERMISSION, ErrorCode.INVALID_PERMISSION.getMessage());
        }

그래서 혹시나 로그인을 잘못했나? 하고 log를 찍어보았다.

log.info("\ncommentUser = " + comment.getUser().getUserName() + "\nLoginUser = " + userName);
        if (!comment.getUser().getUserName().equals(userName)){
            throw new AppException(ErrorCode.INVALID_PERMISSION, ErrorCode.INVALID_PERMISSION.getMessage());
        }

역시 같은 아이디로 들어왔다.
그런데 다르다고 인식이 되는건??

순간 문자열을 비교할때 비교연산자를 쓰면 안된다는것이 기억났다.
그래서 코드를 equals를 사용하게 바꿔보았다.

equals를 사용하니 수정이 잘되었다.
별거 아니지만, 생각하는 힘이 조금은 생겼따는 생각에 기분이 좋아졌다.

if (!comment.getUser().getUserName().equals(userName)){
            throw new AppException(ErrorCode.INVALID_PERMISSION, ErrorCode.INVALID_PERMISSION.getMessage());
        }

문자열 비교 주의사항

이번기회에 왜 비교연산자 말고 equals를 사용해야하는지 확실히 알아봐야겠다고 생각했다.

  1. 비교 연산자 (==, != 등..)

    • 주소의 값을 비교한다. (Call By Reference)
  2. equals() 메소드

    • 객체끼리 내용을 비교한다. (Call By value)
    • Object클래스의 메소드이다.
    • 만약 String 객체라면 문자열 값이 같으면 True를 리턴한다.
  • equals 메소드를 알아보자
public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String aString = (String)anObject;
            if (coder() == aString.coder()) {
                return isLatin1() ? StringLatin1.equals(value, aString.value)
                                  : StringUTF16.equals(value, aString.value);
            }
        }
        return false;
    }

두번째 if문에서 String이라면 문자열을 비교하는 것을 볼 수 있다.

오류가 난 이유

위에서 확인했듯 오류가 난 이유는 문자열 자체를 비교한것이 아니라 객체의 주소를 비교해서 그런것이였다.
comment안에있는 User의 객체주소와 Authentication의 객체주소를 비교했으니 당연히 항상 false를 낼 수 밖에 없던것이였다.

앞으로도 비교를 할때는 객체가 비교가 되는지, 안에 들어있는 값을 비교하는지 잘 생각해보면서 Equals()를 사용할지, 비교연산자를 사용할지 결정해야겠다.








profile
배우고, 생각하고, 행동해라

0개의 댓글