인프런 커뮤니티 질문&답변

닥부님의 프로필 이미지
닥부

작성한 질문수

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

Exclude Annotation

find() 에서 password를 숨길때 사용하는 어노테이션 옵션 차이

작성

·

282

1

안녕하세요.

아래 두가지 어노테이션 차이가 궁금합니다.

@Column({select: false})
password
@Exclude()
password

차이가 뭔가요?

둘중 어느것을 써도 find() 에서 password 를 숨겨지는거같은데

용도 차이가 궁금합니다.

답변 2

0

저도 궁금해서 좀 테스트 해 보니까 이런 차이가 있네요

  • Column({select: false}) 인 경우는
    애초에 ORM에서 select쿼리를 만들 때 컬럼에 포함시키지 않습니다.

    • 즉 위처럼 선언한 후 find() 하는 경우 조회된 UserModel 에서 password 필드는 완전히 비어 있습니다.

    • 비지니스 로직에서 usermodel.password 로 사용할 수 없겠죠

  • @Exclude() 를 사용하는 경우는 DB에서 select는 해오지만, 외부로 전달하는 json이 만들어질때 해당 필드가 제외(exclude) 되는것 같습니다.

    • 아마 ClassSerializerInterceptor 가 해당 오브젝트를 json 으로 만드는 순간 개입하여 Exclude() 된 필드를 제외하는것 같습니다.

    • 비지니스 로직에서 usermodel.password 를 사용하는경우 실제 DB에서 조회된 값이 존재합니다.

디버그 모드로 보면서 테스트 해 보니 요런 차이가 있는것 같네요

정리하면

  • ORM 레벨에서 select를 막느냐 (결과적으로 app 에서 전달할 값도 없게 됨)

  • app 레벨에서 응답시 특정 필드를 무시하느냐

인듯 합니다.

0

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

같은 기능으로 사용 가능합니다.

다만 두 기능은 서로 다른 패키지에서 제공 해주기 때문에 왜 중복된 기능이 존재하냐는 질문은 유효하지 않습니다.

감사합니다!

닥부님의 프로필 이미지
닥부

작성한 질문수

질문하기