개요 Spring 프레임워크는 IoC(제어의 역전) 컨테이너를 통해 객체 생성과 의존성 주입을 자동으로 관리한다. 이때 핵심적으로 활용되는 기술이 리플렉션(Reflection)이다. 스프링 컨테이너는 각 Bean을 BeanDefinition이라는 메타정보 객체에 정의해두고, 이를 기반으로 리플렉션을 이용해 실제 객체 인스턴스를 생성한다. 이 과정은 XML설정이나 애노테이션을 읽어 BeanDefinition을 구성하는 단계부터 시작되며, 이후 내부 로직을 확인하면 리플렉션이 어떤 방식으로 객체 생성에 활용되는지 확인할 수 있다. 이러한 복잡한 과정을 거치면서 의존성 주입(DI)를 사용하는 이유는 명확하다. 객체를 사용하는 쪽에서 직접 생성하지 않고, 외부(스프링 컨테이너)에서 생성된 객체를 주입받음으로써 ..
개요 운영 중인 애플리케이션에서 문제가 발생하면, 원인을 파악하기 위해 당시의 정보가 필요하다. 이를 위해 예외(Exception)가 발생했거나, 중요한 기능이 실행되는 부분에서 적절한 로그를 남겨야 한다.가장 간단한 방법으로 System.out.println()을 이용해 로그를 출력하는 것이다. 이를 활용하면 실행 중 다양한 입출력 및 변수 값을 확인할 수 있다.하지만 System.out.println()은 출력되는 로그의 양이나 수준을 조절할 수 없으며, 로그를 파일에 저장하기도 어렵다.또한, 애플리케이션 성능 저하의 원인이 될 수 있다. println()의 내부 구현을 살펴보면 newLine()메소드를 호출하는데, 해당 메소드에는 synchronized키워드가 적용되어 있다. 즉, newLine()..