티스토리 뷰

728x90

0. 스프링 부트를 사용할 경우 복잡하게 placeholder를 따로 설정할 필요없이 그냥 쓰면 된다.

  0-1 프로그램에서 사용할 속성을 application.properties파일에 입력한다.

    0-1-1 application.properties를 사용할 때는 윈도우라도 위의 설정 예시처럼 \\ 대신 /을 사용해야 한다.

 

itinerary.email.subject=Itinerary for your Flight
itinerary.email.body=Please check your itinerary attached

itinerary.pdf.filePath=C:/Users/heops/Documents/itinerary-pdfs

 

  0-2. 사용할 프로그램에서 @Value("${}") 로 접근하여 값을 읽어온다.

 

@Service
public class ReservationServiceImpl implements ReservationService {

  @Value("${itinerary.pdf.filePath}")
  private String ITINERARY_FILE;

...

    Reservation saveReservation = this.reservationRepository.save(reservation);
    LOGGER.info("Inside bookFlight() saved reservation: " + saveReservation.toString());
    
    String filePath = ITINERARY_FILE + "/reservation-"+saveReservation.getId().toString() + ".pdf";
    
    this.pdfGenerator.generateItinerary(reservation, filePath);
    this.emailUtil.sendItinerary(passenger.getEmail(), filePath);
    
    return saveReservation;

...

@Component
public class EmailUtil {
  
  @Value("${itinerary.email.subject}")
  private String ITINERARY_EMAIL_SUBJECT;
  
  @Value("${itinerary.email.body}")
  private String ITINERARY_BODY;

  private static final Logger LOGGER = LoggerFactory.getLogger(EmailUtil.class);
  
  @Autowired
  private JavaMailSender sender;
  
  public void sendItinerary(String toAddress, String filePath) {
    LOGGER.info("Inside sendItinerary() toAddress: " + toAddress + ", filePath: " + filePath);
    
    MimeMessage message = this.sender.createMimeMessage();
    
    try {
      MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
      
      messageHelper.setTo(toAddress);
      messageHelper.setSubject(ITINERARY_EMAIL_SUBJECT);
      messageHelper.setText(ITINERARY_BODY);
      messageHelper.addAttachment("Itinerary.pdf", new File(filePath));
      sender.send(message);
      
    } catch (MessagingException e) {
      LOGGER.error("Exception in sendItinerary " + e.toString());
    }
  }
}

 


 

1. 위에서 설명한 주입방식에 더하여 한가지 더 설명하면 설정을 위한 별도의 컴포넌트를 생성할 수 있다.

  1-1 아래의 값들이 application.properties에 있다고 가정한다.

 

basic.value=true
basic.message=Welcome to Website
basic.number=7

 

  1-2 이 값들을 읽어오는 컴포넌트 클래스를 하나 작성한다.

    1-2-1 @ConfigurationProperties에 어떤 namespace를 사용할지는 지정해 준다. 아래는 basic.으로 시작하는 경우다.

    1-2-2 @Component로 설정하여 초기화 때 스프링이 객체를 생성하도록 하였다.

    1-2-3 속성으로 설정값을 주입하기 때문에 setter가 필요하다. 아래 클래스는 @Data로 자동 생성되어 있다.

 

package pe.pilseong.springdepth.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import lombok.Data;

@Component
@ConfigurationProperties("basic")
@Data
public class BasicConfig {
  
  private boolean value;
  private String message;
  private int number;


}

 

  1-3 이 값들을 사용하는 controller를 작성한다. 이 controller는 해당 설정값을 Autowired하여 받아온다.

  1-4 받아온 값들은 어디에서든지 사용할 수 있다.

 

package pe.pilseong.springdepth.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import pe.pilseong.springdepth.config.BasicConfig;
import pe.pilseong.springdepth.service.WelcomeService;

@RestController
public class WelcomeController {
  
  @Autowired
  private WelcomeService welcomeService;


  @Autowired
  private BasicConfig config;

  @RequestMapping("/welcome")
  public String welcome() {
    return this.welcomeService.retrieveWelcomeMessage();
  }

  @RequestMapping("/dynamicConfig")
  public Map<String, Object> dynamicConfig() {
    Map<String, Object> map = new HashMap<>();

    map.put("value", config.isValue());
    map.put("message", config.getMessage());
    map.put("number", config.getNumber());

    return map;
  }
}

 

  1-5 생성된 설정값은 아래의 actuator/configprops 경로로 확인할 수 있다.

 

 

2. 스프링 부트 2.3.1, 2.2.7에서 Immutable Binding을 사용하려고 시도해보았으나 정상동작하지 않았다. 안되면 그냥 예전방법을 쓰는 게 낫다. immuable 바인딩도 별의미도 없고.

728x90
댓글