Spring Framework 문제와 풀이

1. 의존성 주입 (Dependency Injection) 문제

 

문제: UserServiceUserRepository를 사용하여 유저 정보를 관리합니다. 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 빈과 컴포넌트 스캔 문제

 

문제: ProductServiceProductRepository 클래스가 있습니다. 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")로 각 환경에 맞는 빈을 정의하고, 활성화된 프로파일에 따라 적절한 빈이 사용됩니다.

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유