티스토리 뷰

728x90
반응형

목차

     

    평소에 관성적으로 써오면서도 정확히 무슨 역할을 하는지 몰랐던 애너테이션 몇 개를 정리하고 넘어가려고 한다.

     

    대상은 아래와 같다.

     

    • @Lazy
    • @LazyCollection
    • @JsonManagedReference
    • @JsonBackReference
    • @JsonIgnoreProperties
    • @JsonProperty

     

    @Lazy

     

    스프링 프레임워크를 사용하면 소프트웨어 시작시 애플리케이션 컨텍스트 로드와 함께 등록된 모든 빈들이 생성된다.

     

    따라서 코드의 규모가 커지고 빈의 개수가 많아질수록 필연적으로 메모리 점유율이 올라가고 시작시간이 느려질 수밖에 없는데,

     

    @Lazy는 이런 문제를 조금이라도 해결하기 위해 스프링 프레임워크에서 지원하는 애너테이션이다.

     

    해당 애너테이션을 붙인 은 자동으로 지연로딩(Lazy Loading) 대상이 되는데,

     

    여기서 지연로딩이란 빈이 소프트웨어 실행 시점이 아닌 필요한 시점, 즉 요청을 받는 순간에 생성된다.

     

    @LazyCollection

     

    @LazyCollection은 정확하게 말하면 스프링 프레임워크가 아닌 Hibernate 라이브러리에서 지원하는 애너테이션이다.

     

    따라서 그래들에 JPA와 관련된 의존성이 있어야만 사용할 수 있는 애너테이션이라 할 수 있다.

     

    이 애너테이션은 위의 @Lazy와 헷갈리기 쉽지만, 역할이 조금 다르다.

     

    어떻게 다르냐면, 이 애너테이션은 엔티티의 컬렉션 필드에서 값을 요청할 때,

     

    즉 일대다 혹은 다대다 관계에서 데이터를 요청할 때 지연로딩을 할 수 있도록 도와준다.

     

    이 애너테이션이 붙은 컬렉션 필드는 실제 조회가 이루어질 때까지 데이터를 가져오지 않으며,

     

    이는 시스템 리소스를 절약하는 효과를 가져온다.

     

    추가로 외래키를 사용하는 MySQL과 같은 경우 이미 지연로딩이 적용되어 있을 가능성이 있어 필요가 없을 수 있고,

     

    @OneToMany(fetch=FetchType.LAZY)의 경우 유사한 기능을 하지만 일대다 관계에서는 즉시로딩이 발생할

     

    가능성이 있어 주의가 필요하다.

     

    Summary

     

      @Lazy @LazyCollection
    대상 단일 빈 컬렉션 필드
    프록시 프록시 객체 생성 컬렉션을 감싸는 프록시 객체 생성
    사용 시점 빈이 처음 사용될 때 컬렉션의 요소에 처음 접근할 때

     

    Proxy Object

     

    프록시 객체는 이름 그대로 실제 객체의 대리 객체를 가리킨다.

     

    여기서는 필요한 시점에 실제 객체를 생성하고 초기화하는 기능을 하며,

     

    이를 통해 불필요한 시스템 리소스나 쿼리를 요구하지 않고 필요한 시점에만 실행할 수 있게 된다.

     

    • 프록시 객체
      원본 객체를 사용하기 전까지 대신 사용(가벼움). 원본 객체의 메서드를 호출할 수 있으며 원본 객체를 참조하고 있음
      원본 객체에 대한 접근 지연을 통해 성능 향상에 도움이 됨
    • 컬렉션을 감싸는 프록시 객체
      컬렉션 객체 대신 사용할 수 있는 객체. 컬렉션의 원소에 접근하는 과정에서 지연로딩을 수행.
      이를 통해 필요한 원소만 로딩함으로써 성능 향상에 도움이 됨

     

    @JsonManagedReference + @JsonBackReference

     

    두 메서드는 스프링 프레임워크에 내장된 Jackson JSON 라이브러리에서 사용되는 애너테이션이다.

     

    역참조를 처리하는 역할을 하는데, 쉽게 말하면 양방향 연관된 객체 중 하나를 직렬화할 때

     

    연관된 객체를 함께 출력하고, 그 객체가 또다시 연관된 원래 객체를 출력하며 생기는 무한루프를 방지한다고 할 수 있다.

     

    추가적인 차이점은 아래와 같다.

     

    @JsonManagedReference @JsonBackReference
    연관관계의 소유자 객체에서 사용(일대다에서 일) 연관관계의 주인 객체에서 사용(일대다에서 다)
    JSON 출력시 연관 객체 정보 포함 JSON 출력시 소유자 객체 정보 포함하지 않음

     

    @JsonProperty

     

    역시 JackSon 라이브러리에서 지원하는 애너테이션으로,

     

    필드에 붙여서 JSON데이터의 키와 매핑하거나 직렬화/역직렬화 시 사용할 세세한 설정을 해줄 수 있다.

     

    • value: JSON 객체에서 해당 프로퍼티의 이름 지정
    • access
      역직렬화 시 해당 프로퍼티를 생성자를 통해 바인딩할 것인지, Setter를 통해 바인딩할 것인지,
      혹은 Getter를 통해 값을 가져올 것인지 지정
    • index: JSON 객체에서 해당 프로퍼티의 인덱스 지정
    • defaultValue: 역직렬화 시에 해당 프로퍼티가 존재하지 않을 경우 사용할 기본값을 지정
    • required: 역직렬화 시에 해당 프로퍼티가 반드시 존재해야 하는지 여부를 지정
    • nulls: 직렬화 시에 해당 프로퍼티의 값이 null인 경우 어떻게 처리할지 지정
    • unknown: JSON 객체에서 알 수 없는 프로퍼티가 있을 경우 어떻게 처리할지를 지정

     

    @JsonIgnoreProperties

     

    마찬가지로 JackSon 라이브러리에서 지원하는 애너테이션으로,

     

    클래스에 붙여서 JSON 직렬화/역직렬화 시 무시해야 하는 속성을 지정할 수 있다.

     

    예를 들어 회원 엔티티의 비밀번호 같은 경우 실수로 직렬화해서 노출하면 안 되기 때문에

     

    해당 애너테이션을 사용해서 역직렬화만 가능하도록 설정해 줄 수 있다. 예를 들면 아래와 같다.

    @JsonIgnoreProperties(value = { "password" })
    public class User {
        private String email;
    	private String nickName;
    	private String password;
    }
    반응형
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2024/05   »
    1 2 3 4
    5 6 7 8 9 10 11
    12 13 14 15 16 17 18
    19 20 21 22 23 24 25
    26 27 28 29 30 31
    글 보관함