Spring Boot : application.properties 읽어오기
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 바인딩도 별의미도 없고.