티스토리 뷰
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 바인딩도 별의미도 없고.
'Spring > Spring Boot' 카테고리의 다른 글
Spring Boot : 기초지식 (0) | 2020.05.23 |
---|---|
Spring Boot : Security 사용하기 기본 Configuration (0) | 2020.05.01 |
Spring Boot : Logger logback 설정파일 작성 및 Customization (2) | 2020.05.01 |
Spring Boot : Logger 사용 기본 절차 및 레벨 설정 (0) | 2020.05.01 |
Spring Boot : PDF Generator(itextpdf) 사용하기 + Email 전송 (0) | 2020.04.30 |
- Total
- Today
- Yesterday
- 도커 개발환경 참고
- AWS ARN 구조
- Immuability에 관한 설명
- 자바스크립트 멀티 비동기 함수 호출 참고
- WSDL 참고
- SOAP 컨슈머 참고
- MySql dump 사용법
- AWS Lambda with Addon
- NFC 드라이버 linux 설치
- electron IPC
- mifare classic 강의
- go module 관련 상세한 정보
- C 메모리 찍어보기
- C++ Addon 마이그레이션
- JAX WS Header 관련 stackoverflow
- SOAP Custom Header 설정 참고
- SOAP Custom Header
- SOAP BindingProvider
- dispatcher 사용하여 설정
- vagrant kvm으로 사용하기
- git fork, pull request to the …
- vagrant libvirt bridge network
- python, js의 async, await의 차이
- go JSON struct 생성
- Netflix Kinesis 활용 분석
- docker credential problem
- private subnet에서 outbound IP 확…
- 안드로이드 coroutine
- kotlin with, apply, also 등
- 안드로이드 초기로딩이 안되는 경우
- navigation 데이터 보내기
- 레이스 컨디션 navController
- raylib
- 외부파일
- WebMvc
- form
- 설정
- Security
- 자바
- login
- Validation
- 하이버네이트
- mapping
- Spring Security
- Angular
- 설정하기
- 스프링
- jsp
- Spring
- 상속
- XML
- 스프링부트
- Rest
- 매핑
- one-to-one
- hibernate
- RestTemplate
- Many-To-Many
- one-to-many
- crud
- MYSQL
- 로그인
- spring boot