목록전체 글 (518)
개발놀이터
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. 오버라이딩은 상위 클래스의 메소드를 재정의 하는 것을 의미합니다. 또, 런타임 다형성이기도 합니다. 오버로딩은 같은 클래스 내에서 동일한 메소드 이름을 가지지만 매개변수의 타입, 개수가 다르게 구현할 수 있는 것을 의미하며 컴파일 타임 다형성이기도 합니다.
Q. 접근제어자의 종류와 이에 대해 설명해주세요. A. private, default, protected, public이 있습니다. private는 해당 클래스 내에서만 접근 가능하고, default는 해당 패키지, protected는 상속한 클래스, public은 전체 영역에서 접근 가능합니다. 접근 제어자를 사용하는 이유는 외부에서 보여주고 싶은 정보들을 선택적으로 제공하기 위함이고, 객체지향에서 말하는 캡슐화와 통하는 면이 있습니다.
Q. 자바의 원시타입들은 무엇이 있으며 각각 몇 바이트를 차지하나요? A. boolean 1바이트, unsigned char 2바이트, byte 1바이트, short 2바이트, int 4바이트, long 8바이트, float 4바이트, double 8바이트입니다. 하지만 사실 JVM에 의존적이기 때문에 정확한 크기라기 보다는 대략적인 크기입니다.
본 포스팅은 인프런의 정수원님의 스프링 배치 강의를 듣고 정리한 포스팅입니다. 더 자세한 내용은 강의를 참고해주세요. Parallel Steps 기본 개념 SplitState 를 사용해서 여러 개의 Flow 들을 병렬적으로 실행하는 구조 실행이 다 완료된 후 FlowExecutionStatus 결과들을 취합해서 다음 단계를 결정한다. 구조 Job이 Flow를 통해 SplitState를 만들어서 TaskExecutor를 통해 스레드를 생성하고 각각의 FutureTask를 통해 멀티테스킹을 유도합니다. 앞선 포스팅에서 AsyncItemProcessor, AsyncItemWriter와 Multi-threaded Step 처럼 Step을 멀티스레드로 처리하는 것이 아닌 Flow를 멀티스레드로 처리하고 싶을 때 ..
본 포스팅은 인프런의 정수원님의 스프링 배치 강의를 듣고 정리한 포스팅입니다. 더 자세한 내용은 강의를 참고해주세요. Multi-threaded Step 기본 개념 Step내에서 멀티 스레드로 Chunk 기반 처리가 이루어지는 구조 TaskExecutorRepeatTemplate이 반복자로 사용되며 설정한 개수 만큼의 스레드를 생성하여 수행한다. 이를 그림으로 알아보면 다음과 같습니다. 기존에는 TaskletStep이 RepeatCallback을 수행하고 이 때 ChunkOrientedTasklet이 수행됩니다. 하지만 Multi-threaded Step 에서는 TaskExecutorRepeatTemplate이 Runnable을 실행하고 그 안에서 RepeatCallback이 수행됩니다. 이 부분이 원래..