목록전체 글 (531)
개발놀이터
Q. IoC 컨테이너의 역할은 무엇이 있을까요? A. 애플리케이션 실행 시점에 빈 오프젝트를 인스턴스화 하고 DI 한 후에 최초로 애플리케이션을 기동할 빈 하나를 제공해줍니다.
Q. 스프링 Bean의 Scope에 대해서 설명해주세요. A. 빈 스코프는 빈이 존재할 수 있는 범위를 뜻하며 싱글톤, 프로토타입, request, session, application 등이 있습니다. 싱글톤은 기본 스코프로 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프입니다. 프로토타입은 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프입니다. request는 웹 요청이 들어오고 나갈때까지 유지하는 스코프, session은 웹 세션이 생성, 종료할때까지, application은 웹 서블릿 컨텍스트와 같은 범위로 유지하는 스코프입니다.
Q. 스프링 Bean의 생성 과정을 설명해주세요 A. 객체 생성, 의존 설정, 초기화, 사용, 소멸의 과정의 생명주기를 가지고 있습니다. Bean은 스프링 컨테이너에 의해 생명주기가 관리되며 빈 초기화 방법은 @PostConstruct를 빈 소멸에는 @PreDestroy를 사용합니다. 생성한 스프링 빈을 등록할 때는 ComponentScan을 이용하거나 @Configuration의 @Bean을 사용하여 빈 설정파일을 직접 빈으로 등록할 수 있습니다.
Q. 스프링 빈이란 무엇인가요? A. 스프링 빈은 스프링 컨테이너에 의해 관리되는 자바 객체입니다. (꼬리질문) Q. 스프링 컨테이너는 무엇인가요? A. 스프링 컨테이너는 스프링 빈의 생명 주기를 관리하며, 생성된 스프링 빈들에게 추가적인 기능을 제공하는 역할을 합니다. 개발자가 만든 객체는 new 연산자, 인터페이스 호출 등의 방식으로 생성되고 소멸되지만 스프링 컨테이너를 사용하면 해당 역할을 대신해줍니다. 즉, 제어 흐름을 외부에서 관리하게 됩니다. 또한, 객체들 간의 의존 관계를 스프링 컨테이너가 런타임 과정에서 알아서 만들어 줍니다.
Q. DI가 뭔가요? A. DI는 스프링 프레임워크에서 지원하는 IoC의 형태로 클래스 사이의 의존 관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것을 의미합니다. 스프링에서는 스프링 컨테이너 ApplicationContext를 이용하여 설정 정보를 생성, 등록하고 필요한 객체를 생성자 혹은 setter 를 통해 주입하거나 필드에서 주입합니다. Q. DI의 종류는 어떤 것이 있고 이들의 차이는 무엇인가요? / 주입하는 방법들에 대해서 설명해주세요 A. DI를 통해 주입하는 방법에는 세 가지 방법이 있습니다. 생성자 주입, setter를 이용한 주입, 필드 주입이 있습니다. 생성자 주입은 생성자 호출 시점에 딱 한번만 호출되는 것을 보장하며 불변, 필수 의존관계에서 사용합니다. setter..
Q. 동시성 문제에 대해서 설명해주세요 A. 동시성 문제란 멀티스레드 환경에서 하나의 변수 혹은 메소드에 여러 스레드가 접근해 값이 중복되어 개발자가 원했던 로직대로 움직이지 않는 현상을 말합니다. 동시성 프로그래밍에서는 CPU와 RAM의 중간에 위치하는 CPU Cache Memory와 병렬성이라는 특징 때문에 다수의 스레드가 공유 자원에 접근할 때 가시성과 원자성이라는 두가지 문제가 발생합니다. 가시성을 해결하기 위해선 volatile 키워드를 원자성을 해결하기 위해선 synchronized 키워드를 사용해야 합니다. Q. 가시성이랑 원자성이 정확히 어떤 문제인가요? A. 여러 개의 스레드가 사용됨에 따라 CPU Cache Memory 와 RAM의 데이터가 서로 일치하지 않아 생기는 문제입니다.
Q. 직렬화와 역직렬화에 대해서 설명해주세요 A. 직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트 형태로 데이터 변환하는 기술과 바이트로 변환된 데이터를 다시 변환하는 기술(역직렬화)을 아울러서 이야기 합니다.자바 직렬화는 JVM의 메모리에서만 상주되어있는 객체 데이터를 영속화(Persistence)가 필요할 때 사용됩니다. 시스템이 종료되더라도 없어지지 않는 장점을 가지며 영속화된 데이터이기 때문에 네트워크로 전송이 가능합니다.
Q. 강한 결합과 느슨한 결합이 무엇인가요? A. 결합도는 서로다른 두 모듈 간의 의존성 정도를 나타내며 다른 모듈에 대해 얼마나 많은 정보를 알고 있는지에 대한 척도입니다. 어떤 모듈이 다른 모듈에 너무 자세한 부분까지 알고 있을 경우 강한 결합도를 가진다고 합니다. 어떤 모듈이 다른 모듈에 대해 필요한 정보만 알고 있다면 두 모듈은 낮은 결합도를 가진다고 합니다. 객체지향 관점에서 결합도는 객체 또는 클래스가 협력에 필요한 적절한 수준의 관계만을 유지하고 있는지를 나타냅니다. 이러한 관점에서 강한 결합도는 반드시 지양해야 하며, 개발자는 적절한 결합도를 유지할 수 있도록 고민하고 설계해야 합니다.
Q. 오버라이딩과 오버로딩이 무엇이며 어떤 차이가 있을까요? A. 오버라이딩은 상위 클래스의 메소드를 재정의 하는 것을 의미합니다. 또, 런타임 다형성이기도 합니다. 오버로딩은 같은 클래스 내에서 동일한 메소드 이름을 가지지만 매개변수의 타입, 개수가 다르게 구현할 수 있는 것을 의미하며 컴파일 타임 다형성이기도 합니다.