일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- git stage
- 날짜형을 문자형으로
- JSONArray 분할
- spring webflux
- nonblocking
- 무시하기
- 성능개선
- org.json
- jar 소스보기
- 스테이지에 올리기
- JSON 분할
- 문자형을 날짜형으로
- 폐기하기
- Meta Table
- ChainedTransactionManager #분산데이터베이스 #Spring Boot #MyBatis
- JSON 분리
- date_format
- JobExecutionAlreadyRunningException
- 스프링 웹플럭스
- 마이바티스 트랜잭션
- spring reactive programming
- 스프링 리액티브 프로그래밍
- batchInsert
- multi update
- 스프링 배치 메타 테이블
- 마리아디비
- 스프링 배치 공식문서
- JSON 분해
- JSONObject 분할
- str_to_date
- Today
- Total
ebson
[AI 활용과 개발] ChatGPT 를 활용해 스프링의 핵심원리 (DI, IOC) 관련 코드 작성하기 (ApplicationContext 사용하기) 본문
[AI 활용과 개발] ChatGPT 를 활용해 스프링의 핵심원리 (DI, IOC) 관련 코드 작성하기 (ApplicationContext 사용하기)
ebson 2024. 5. 9. 23:39Spring Boot 에서 ApplicationContext 의 역할
자바 개발자라면 누구나 한번쯤 ApplicationContext 에 대해서 들어봤을 것이다. ApplicationContext 는스프링 프레임워크에서 제공하는 컨테이너로 스프링의 빈(Bean)들을 관리하는 역할을 한다. 아래는 Spring Framework 에서 ApplicationContext 의 기능과 역할에 대한 ChatGPT의 대답이다.
ChatGPT에게 ApplicationContext를 활용하기 위한 질문하기
ApplicationContext 를 사용하면 특정 빈(Bean)을 컨테이너로부터 가져와 사용할 수 있다. ApplicationContext를 활용하기 위해 ChatGPT에게 간단한 질문을 해보았다. 아래는 예시 코드를 포함한 ChatGPT의 대답이다.
Spring Boot 앱에서 ApplicationContext 를 사용하는 방법은 두가지인데 첫번째는 @Autowired 어노테이션을 사용해 ApplicationContext 를 사용하는 것이고 두번째는 ApplicationContextAware 인터페이스를 구현한 클래스를 생성하고 setApplicationContext 메서드를 오버라이드하여 ApplicationContextAware 인터페이스의 구현체가 컨텍스트에 저장된 모든 빈에 접근할 수 있도록 하면서 getApplicationContext 와 같은 메서드를 통해 ApplicationContext를 사용하는 방법이다. 두번째 방법이 ApplicationContext 를 더 안전하게 사용하기 위해 선호되는 방법이다. 예를 들어, 아래와 같이 구현하여 사용할 수 있다.
@Component
public class ApplicationContextAwareImpl implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ApplicationContextAwareImpl.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
}
이와 같이 작성하여 @Component 어노테이션을 추가해 빈(Bean)으로 등록하면 원하는 곳에서 이 클래스를 사용할 수 있다. 참고로, ApplicationContextAware 인터페이스의 구현체에 대하여 @Component 어노테이션을 사용하는 이유에 대한 ChatGPT의 대답은 다음과 같다.
예를 들어, 레디스 캐시 설정을 작성하는 경우에는 ConnectionFactory 빈과 Template 빈 사이에 관계를 정의해주어야 하고 쿼츠 스케줄러 설정을 작성하는 경우에는 SchedulerFactoryBean 빈과 Scheduler 빈 사이의 관계를 정의해주어야 하기 때문에 @Configuration 어노테이션을 사용한다. 그리고 ApplicationContextAware 인터페이스의 구현체를 작성한 경우 단지 빈 등록이 필요한 상황이므로 @Component 어노테이션을 사용한다.
@Component 어노테이션과 함께 ApplicationContextAware 인터페이스의 setApplicationContext 메서드가 그 구현체가 빈으로 등록되는 시점에서 실행될 것이다. 다음은 ApplicationContextAware의 동작 방식에 대한 ChatGPT의 대답이다.
ApplicationContext 를 활용한 컴포넌트 클래스 작성하기
ApplicationContextAware의 구현체가 빈으로 등록되었기 때문에 원하는 클래스에서 이를 사용하여 빈을 조회할 수 있게 되었다. ApplicationContextAware 에서 ApplicationContext를 가져와서 특정 빈을 조회하는 코드를 다음과 같이 작성할수 있다.
@Service
public class KakaoFPBlockService {
private static final Logger log = LoggerFactory.getLogger(KakaoFPBlockService.class);
ApplicationContext applicationContext = ApplicationContextAwareImpl.getApplicationContext();
@Autowired
ScenarioServiceBeanIdProvider beanIdProvider;
public SkillResponse retrieveScenarioServiceAndReturn(SkillBusiV1UserFpEntity skillBusiV1UserFpEntity
, BuilderV1BlockEntity builderV1BlockEntity
, BuilderV1BlockContextEntity builderV1BlockContextEntity
, String channelName){
SkillResponse skillResponse = null;
try {
BuilderV1ScenarioEntity builderV1ScenarioEntity = builderV1BlockEntity.getBuilderV1ScenarioEntity();
String scenarioCode = builderV1ScenarioEntity.getScenarioCode();
KakaoFPScenarioService kakaoFPScenarioService = (KakaoFPScenarioService) applicationContext.getBean(beanIdProvider.getBeanId(channelName, scenarioCode));
skillResponse = kakaoFPScenarioService.getTemplateAndReturn(skillBusiV1UserFpEntity, builderV1BlockEntity, builderV1BlockContextEntity, channelName);
} catch (Exception e) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
}
return skillResponse;
}
}
try 블록에서 ApplicationContext 의 getBean 메서드를 사용해 원하는 빈(Bean)을 조회하는 것이 핵심이다. 이때, 빈(Bean)의 아이디를 제공하는 클래스를 별도로 작성할 필요가 있다. 이는 다음과 같이 작성할 수 있다.
@Component
public class ScenarioServiceBeanIdProvider {
private final Map<String, String> FPBeanIdMap = new HashMap<>();
@PostConstruct
private void FPinit() {
// 여기에 서비스 빈의 아이디를 key-value 형태로 추가합니다.
FPBeanIdMap.put("S01", "KakaoFPScenarioS01Service");
FPBeanIdMap.put("S02", "KakaoFPScenarioS02Service");
FPBeanIdMap.put("S03", "KakaoFPScenarioS03Service");
FPBeanIdMap.put("S04", "KakaoFPScenarioS04Service");
FPBeanIdMap.put("S05", "KakaoFPScenarioS05Service");
}
public String getBeanId(String ChannelName, String ScenarioCode) {
Map<String, String> beanIdMap = switch (ChannelName) {
case "FP" -> {
yield FPBeanIdMap;
}
// 여기에 더 많은 채널에 대한 케이스를 추가할 수 있습니다.
default -> FPBeanIdMap; // 기본적으로 제공된 ScenarioCode 사용
};
return beanIdMap.get(ScenarioCode);
}
}
코드 값을 키로 갖고 빈(Bean)의 아이디를 값으로 갖는 Map 객체를 생성하여 초기화한 후, getBeanId 메서드에서 전달받은 문자열에 해당하는 Map 객체과 전달받은 코드 값에 따른 빈(Bean)의 아이디를 반환하도록 하는 클래스이다. 이 클래스를 사용하면 입력값에 따라 원하는 서비스 빈의 아이디를 얻을 수 있다.
이상으로 ApplicationContext 를 활용하기 위한 ApplicationContextAware 인터페이스의 구현체를 작성하고 이를 활용하는 템플릿 코드와 빈의 아이디를 반환하는 컴포넌트 클래스를 작성해 보았다. 이 방법을 사용하면 비즈니스 로직에 필요한 특정 서비스 빈(Bean)을 선택적으로 사용할 수 있게 된다. 스프링이 제어의 역전이라는 원리를 기반으로 빈을 관리하는 컨테이너를 제공하기 때문에 가능한 방법이다.
클래스 코드를 작성하면서 궁금한 부분을 바로바로 ChatGPT 에게 질문하여 대답을 얻는 것은 구글 검색하는 방법보다는 익숙하지 않지만 확실히 효과적이었다. 앞뒤 대화 문맥을 고려하여 ChatGPT가 구현하고자 하는 코드의 템플릿을 어느정도 작성해주기 때문에 이를 바탕으로 수정 보완하는 작업을 거치면 원하는 코드가 완성되어 있었기 때문이다. 이후 기회가 되면 코파일럿과 같은 코드 자동 생성 서비스도 사용해 볼 기회가 있으면 좋겠다.
'KAKAO CHATBOT' 카테고리의 다른 글
[AI 활용과 개발] ChatGPT를 활용하여 JPA 개발하고 테스트하기 (0) | 2024.05.10 |
---|---|
[AI 활용과 개발] 카카오 빌더 개발문서 참고하여 필수 테이블 설계하기 (0) | 2024.05.08 |
[AI 활용과 개발] ChatGPT 를 통해 ChatGPT 더 알아보기 (1) | 2024.05.06 |
[AI 활용과 개발] ChatGPT 가 안 좋아할 질문 해보기 (0) | 2024.02.06 |
[주요 개념] 모두 보기 (0) | 2023.07.15 |