TIL

[TIL] Spring Boot 로컬과 서버 환경 분리 | 정적 팩토리 메서드

dev_ajrqkq 2024. 8. 10. 01:18

 

8/9 진행사항

✅ 알고르즘 2문제

✅ 챕터1 과제수행

 

 

로컬과 서버 환경 분리

 

 

로컬&개발 환경과 운영환경을 분리하여 local 주소와 배포 주소로 접근하는 것을 목표로 한다.

 

application.yml

spring:
  profiles:
    default: dev
  application:
    name: product-service
  jpa:
    properties:
      hibernate:
        show_sql: true
        format_sql: true
        use_sql_comments: true
        highlight_sql: true
server:
  port: 19093
management:
  tracing:
    sampling:
      probability: 1.0

application.yml에는 공통된 설정을 넣어주었고, spring.profiles.default를 dev로 설정한다.

spring.profiles.default는 spring.profiles.active가 설정되지 않은 경우에만 적용된다.

애플리케이션이 시작될 때 활성화된 프로파일이 지정되지 않은 경우 'dev' 프로파일이 기본적으로 활성화된다.

 

Run Configuration에서 Active profiles를 설정하면 spring.profiles.default 설정은 무시된다.

 

application-dev.yml

spring:
  config:
    activate:
      on-profile: dev
  datasource:
    url: jdbc:mysql://localhost:3306/msa_exam
    username: root
    password: #password
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: create
  data:
    redis:
      host: localhost
      port: 6379
      username: default
      password: systempass
eureka:
  client:
    service-url:
      defaultZone: http://localhost:19090/eureka/
management:
  zipkin:
    tracing:
      endpoint: "http://localhost:9411/api/v2/spans"

개발 환경에서 접속되는 url들을 설정해 두었다.

spring.config.activate.on-profile은 없어도 잘 동작한다.

설정 분기를 명확하게 하고 싶을 때 쓰면 될 거 같다.

 

application-prod.yml

spring:
  config:
    activate:
      on-profile: prod
  datasource:
    url: jdbc:mysql://{rds endpoint}:3306/msa_exam
    username: admin
    password: # password
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: none
  data:
    redis:
      host: # redis host
      port: # redis port
      username: # username
      password: # password
eureka:
  client:
    service-url:
      defaultZone: # eureka url
management:
  zipkin:
    tracing:
      endpoint: # zipkin endpoint

application-prod는 local url -> 배포 url로 바꿔주기만 했다.

 

 

정적 팩토리 메서드 (static factory method)

 

정적 팩토리 메서드는 인스턴스 생성을 위한 대안적인 방법으로

생성자 대신 클래스 내 정적 메서드를 제공해 객체를 반환한다.

 

기존 entity -> dto 변환 작업을

생성자를 사용하는 방법에서

정적 팩토리 메서드를 사용하는 법으로 변경해 주었다.

 

생성자 사용

public OrderResponseDto(Order order) {
    this.orderId = order.getOrder_id();
    for(OrderProduct orderProduct : order.getProduct_ids()){
    	product_ids.add(orderProduct.getProduct_id());
	}
}

 

정적 팩토리 메서드 사용

public static OrderResponseDto fromEntity(Order order){
        return OrderResponseDto.builder()
                .orderId(order.getOrder_id())
                .product_ids(order.getProduct_ids().stream()
                        .map(OrderProduct::getProduct_id)
                        .collect(Collectors.toList()))
                .build();
    }

 

생성자를 사용하면 클래스이름과 같아야 하기 때문에 다양한 이름을 사용할 수 없지만

정적 팩토리 메서드를 사용하면 메서드의 목적이 더 명확해지고 가독성이 높아진다.

ex) OrderResponseDto.fromEntity : Order Entity에서 OrderResponseDto가 되는 메소드

 

또한, 생성자를 사용하면 항상 새로운 인스턴스를 생성해야 되는 단점이 있다.

정적 팩토리 메서드를 사용하면 인스턴스 생성을 제어하여 인스턴스 캐싱이나 싱글톤 패턴 구현에 유용하다.

 

https://f-lab.kr/insight/java-static-factory-methods

 

자바의 정적 팩토리 메소드와 그 장점

자바에서 정적 팩토리 메소드의 개념, 장점 및 사용 예시에 대해 설명하는 글입니다.

f-lab.kr

 

 


 

오늘의 tmi)

분명 이것저것 많이 한 거 같은데.. 실제 결과물은 적은 거 같은 느낌

벌써 2주가 갔다 10 to 16 이상으로의 추가 학습이 필요한 과정이라고 생각한다.

ci/cd는 일요일에 시간 나면 해야겠다,, 내일은 쉴래

msa_exam은 이제 그만 건들자,, 건들수록 수정하고 싶은 게 계속 보인다 끝이 안 날 거 같음ㅋㅋ

과제 요구사항에만 집중하는 걸로~!

 

댓글수0