네로개발일기

개발자 네로의 개발 일기, 자바를 좋아합니다 !

'2022/04'에 해당되는 글 17건


반응형

EntityGraph란,

- 엔티티들은 서로 연관되어 있는 관계가 보통이며 이 관계는 그래프로 표현이 가능하다. EntityGraph는 JPA가 어떤 엔티티를 불러올 때 이 엔티티와 관계된 엔티티를 불러올 것인지에 대한 정보를 제공한다.

 

// getter/setter ...
@Entity
@Table(name = "user")
public class User {

    // other properties
    
    @ToString.Exclude
    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private List<Address> addresses = new ArrayList<>();
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    Optional<User> findById(Long userId);
    
    @EntityGraph(attributePaths = {"addresses"}, type = EntityGraph.EntityGraphType.LOAD)
    Optional<User> findWithAddressesById(Long userId);
}

addresses 가 LAZY이기 때문에 findById로 패치한 User 엔티티에서 addresses에 접근하면 그 때 달려있는 addresses 개수 만큰 select 쿼리를 날린다. 하지만 findWithAddressesById는 @EntityGraph 어노테이션으로 addresses도 함께 패치해오도록 해두었기 때문에 1번의 fetch join 쿼리만 실행된다.

 

/*
 * findById 쿼리
 */
select
    user0_.id as id1_10_0_,
    user0_.username as username2_10_0_
from
    user user0_
where
    user0_.id=?

/*
 * @EntityGraph 달린 findWithAddressesById 쿼리
 */
select
    user0_.id as id1_10_0_,
    addresses1_.id as id1_5_1_,
    user0_.username as username2_10_0_,
    addresses1_.street as street2_5_1_,
    addresses1_.user_id as user_id3_5_0__,
    addresses1_.id as id1_5_0__
from
    user user0_
left outer join
    address addresses1_
        on user0_.id=addresses1_.user_id
where
    user0_.id=?

fetch type을 바꿀 필요도 없고, Querydsl이나 JPQL 같은 쿼리를 별도로 만들지 않아도 되기 때문에 편하다.

 

@EntityGraph의 type은 EntityGraph.EntityGraphType.FETCH 와 EntityGraph.EntityGraphType.LOAD 두가지가 있다.

- FETCH: entity graph에 명시한 attribute는 EAGER로 패치하고, 나머지 attribute는 LAZY로 패치

- LOAD: entity graph에 명시한 attribute는 EAGER로 패치하고, 나머지 attribute는 entity에 명시한 fetch type이나 디폴트 FetchType으로 패치 ( @OneToMany는 LAZY, @ManyToOne은 EAGER 등이 디폴트이다. )

728x90
반응형
blog image

Written by ner.o

개발자 네로의 개발 일기, 자바를 좋아합니다 !

반응형

스프링부트 액추에이터 사용하기

 

액추에이터는 스프링 부트 애플리케이션의 모니터링이나 매트릭(metric)과 같은 기능을 HTTP와 JMX 엔드포인트를 통해 제공한다.

 

액추에이터 개요

액추에이터는 실행 중인 애플리케이션의 내부를 볼 수 있게 하고, 어느 정도까지는 애플리케이션의 작동 방법을 제어할 수 있게 한다. 예를 들면, 다음과 같다.

 

* 애플리케이션 환경에서 사용할 수 있는 구성 속성들

* 애플리케이션에 포함된 다양한 패키지의 로깅 레벨(logging level)

* 애플리케이션이 사용 중인 메모리

* 지정된 엔드포인트가 받은 요청 횟수

* 애플리케이션의 건강 상태 정보

 

스프링 부트 애플리케이션에 액추에이터를 활성화하려면 의존성을 빌드에 추가해야 한다.

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

 

액추에이터 엔드포인트

HTTP 메서드 경로 설명 디폴트 활성화
GET /auditevents 호출된 감사(audit) 이벤트 리포트를 생성한다.  NO
GET /beans 스프링 애플리케이션 컨텍스트의 모든 빈을 알려준다. NO
GET /conditions 성공 또는 실패했던 자동-구성 조건의 내역을 생성한다. NO
GET /configprop 모든 구성 속성들을 현재 값과 같이 알려준다. NO
GET,POST,DELETE /env 스프링 애플리케이션에 사용할 수 있는 모든 속성 근원과 이 근원들의 속성을 알려준다. NO
GET /env/{toMatch} 특정 환경 속성의 값을 알려준다. NO
GET /health 애플리케이션의 건강 상태 정보를 반환한다. YES
GET /heapdump 힙(heap) 덤프를 다운로드한다. NO
GET /httptrace 가장 최근의 100개 요청에 대한 추적 기록을 생성한다. NO
GET /info 개발자가 정의한 애플리케이션에 관한 정보를 반환한다. YES
GET /loggers 애플리케이션의 패키지 리스크(각 패키지의 로깅 레벨이 포함된)를 생성한다. NO
GET /loggers/{name} 지정된 로거의 로깅 레벨(구성된 로깅 레벨과 유효 로깅 레벨 모두)를 반환한다. 유효 로깅 레벨은 HTTP POST 요청으로 설정될 수 있다. NO
GET /mappings 모든 HTTP 매핑과 이 매핑들을 처리하는 핸들러 메서드들의 내역을 제공한다. NO
GET /metrics 모든 메트릭 리스트를 반환한다. NO
GET /metrics/{name} 지정된 메트릭의 값을 반환한다. NO
GET /scheduledtasks 스케줄링된 모든 태스크의 내역을 제공한다. NO
GET /threaddump 모든 애플리케이션 스레드의 내역을 반환한다. NO

액추에이터의 기본 경로 구성하기

액추에이터의 모든 앤드포인트의 경로에는 /actuator가 앞에 붙는다. 액추에이터의 기본 경로는 management.endpoint.web.base-path 속성을 설정하여 변경할 수 있다.

management:
  endpoints:
    web:
      base-path: /management

 

액추에이터의 엔드포인트의 활성화와 비활성화

액추에이터를 추가하면 /health 와 /info 엔드포인트만 기본적으로 활성화되는 것을 알 수 있다. 대부분의 액추에이터 엔드포인트는 민감한 정보를 제공하므로 보안 처리가 되어야 하기 때문이다. 물론 스프링 시큐리트를 사용해서 액추에이터를 보완처리할 수 있다. 그러나 액추에이터 자체로는 보안처리가 되어있지 않으므로 엔드포인트가 기본적으로 비활성화되어 있다.

엔드포인트의 노출 여부를 제어할 때는 management.endpoints.web.exposure.include와 management.endpoints.web.exposure.exclude 구성 속성을 사용할 수 있다.

management:
  endpoints:
    web:
      exposure:
        include: health, info, beans, conditions
        exclude: threaddump, heapdump
728x90
반응형
blog image

Written by ner.o

개발자 네로의 개발 일기, 자바를 좋아합니다 !