1. 의존성 주입 (Dependency Injection) 문제
문제: UserService가 UserRepository를 사용하여 유저 정보를 관리합니다. UserRepository를 의존성 주입을 통해 UserService에 주입하는 코드를 작성하세요.
@Service
public class UserService {
private UserRepository userRepository;
// 의존성 주입을 통해 UserRepository를 주입하세요.
public void saveUser(User user) {
userRepository.save(user);
}
}
풀이:
• UserService 클래스에 UserRepository를 생성자 주입 방식으로 주입하는 방식으로 작성합니다.
@Repository
public class UserRepository {
public void save(User user) {
// 유저 저장 로직
}
}
@Service
public class UserService {
private final UserRepository userRepository;
// 생성자 주입 방식
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void saveUser(User user) {
userRepository.save(user);
}
}
• @Autowired를 사용하여 UserRepository가 자동으로 UserService에 주입됩니다.
2. Spring 빈과 컴포넌트 스캔 문제
문제: ProductService와 ProductRepository 클래스가 있습니다. Spring 빈으로 등록되도록 설정하세요.
public class ProductService {
private ProductRepository productRepository;
public void getProduct(int id) {
productRepository.findProductById(id);
}
}
풀이:
• @Service와 @Repository 어노테이션을 사용하여 빈을 등록합니다.
@Repository
public class ProductRepository {
public Product findProductById(int id) {
// 제품 조회 로직
return new Product(id, "Sample Product");
}
}
@Service
public class ProductService {
private final ProductRepository productRepository;
@Autowired
public ProductService(ProductRepository productRepository) {
this.productRepository = productRepository;
}
public void getProduct(int id) {
productRepository.findProductById(id);
}
}
• @ComponentScan이 설정된 패키지에서 @Service, @Repository 어노테이션을 통해 빈이 자동으로 등록됩니다.
3. 트랜잭션 관리 문제
문제: OrderService가 트랜잭션 내에서 실행되도록 설정하고, 주문 처리가 실패하면 롤백되도록 설정하세요.
@Service
public class OrderService {
public void processOrder(Order order) {
// 주문 처리 로직
}
}
풀이:
• @Transactional 어노테이션을 사용하여 트랜잭션 관리를 설정합니다.
@Service
public class OrderService {
@Transactional
public void processOrder(Order order) {
// 주문 처리 로직
}
}
• @Transactional을 사용하면, processOrder 메서드가 트랜잭션 내에서 실행되고, 예외가 발생하면 자동으로 롤백됩니다.
4. Spring AOP 문제
문제: PaymentService 클래스의 makePayment() 메서드가 호출될 때마다 실행 시간을 측정하고 로그를 출력하는 AOP 설정을 작성하세요.
@Service
public class PaymentService {
public void makePayment(double amount) {
// 결제 처리 로직
}
}
풀이:
• @Aspect와 @Around를 사용하여 메서드 실행 전후의 시간을 측정합니다.
@Aspect
@Component
public class LoggingAspect {
@Around("execution(* com.example.PaymentService.makePayment(..))")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
Object proceed = joinPoint.proceed(); // 메서드 실행
long endTime = System.currentTimeMillis();
System.out.println("메서드 실행 시간: " + (endTime - startTime) + "ms");
return proceed;
}
}
• @Around를 사용하여 메서드 실행 전후에 시간 측정 로직을 넣습니다.
5. Spring MVC 컨트롤러 문제
문제: UserController에서 UserService를 이용해 사용자 정보를 가져오는 getUser() 메서드를 작성하고, 이를 /user/{id} 경로에서 호출되도록 설정하세요.
@Controller
public class UserController {
private UserService userService;
// 사용자 정보를 가져오는 메서드를 작성하세요.
}
풀이:
• @RequestMapping을 사용하여 경로를 설정하고, UserService를 통해 사용자 정보를 가져오는 로직을 작성합니다.
@Controller
public class UserController {
private final UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/user/{id}")
@ResponseBody
public User getUser(@PathVariable int id) {
return userService.getUserById(id);
}
}
• @GetMapping과 @PathVariable을 사용하여 URL 경로에서 ID를 받아와 사용자 정보를 조회합니다.
6. Spring 빈 스코프 문제
문제: ShoppingCart 빈을 요청할 때마다 새로운 인스턴스를 생성하도록 스코프를 설정하세요.
@Component
public class ShoppingCart {
// 장바구니 로직
}
풀이:
• @Scope 어노테이션을 사용하여 빈 스코프를 prototype으로 설정합니다.
@Component
@Scope("prototype")
public class ShoppingCart {
// 장바구니 로직
}
• @Scope("prototype")을 사용하면 요청할 때마다 새로운 ShoppingCart 인스턴스가 생성됩니다.
7. Spring 프로파일 문제
문제: 개발 환경과 프로덕션 환경에서 서로 다른 DataSource 빈을 사용할 수 있도록 @Profile을 설정하세요.
풀이:
• @Profile 어노테이션을 사용하여 각 환경에 맞는 DataSource 빈을 정의합니다.
@Configuration
public class DataSourceConfig {
@Bean
@Profile("dev")
public DataSource devDataSource() {
// 개발 환경용 DataSource 설정
}
@Bean
@Profile("prod")
public DataSource prodDataSource() {
// 프로덕션 환경용 DataSource 설정
}
}
• @Profile("dev")와 @Profile("prod")로 각 환경에 맞는 빈을 정의하고, 활성화된 프로파일에 따라 적절한 빈이 사용됩니다.
'Problem and Solution Guide > Spring Framework' 카테고리의 다른 글
심화 스프링 프레임워크: 문제 해결과 실전 예시 모음 (0) | 2024.09.09 |
---|---|
AOP부터 트랜잭션 관리까지: Spring AOP 문제 풀이로 배우기 (0) | 2024.09.06 |
SpringFramework 테스트: 문제 해결 및 접근 방법 (0) | 2024.08.21 |