|
769 | 769 | <details>
|
770 | 770 | <summary>Spring DI/IoC는 어떻게 동작하나요?</summary>
|
771 | 771 | </br>
|
772 |
| - <p></p> |
| 772 | + <p>IoC(제어의 역전)은 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것으로 코드의 최종호출은 개발자가 제어하는 것이 아닌 프레임워크의 내부에서 결정된 대로 이루어집니다.</p> |
| 773 | + <p>DI(의존관계 주입)은 Spring 프레임워크에서 지원하는 IoC의 형태로 클래스 사이의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해줍니다.</p> |
| 774 | + <p>스프링에서는 스프링 컨테이너 ApplicationContext를 이용하여 설정 정보를 생성, 등록하고 필요한 객체를 생성자 혹은 setter를 통해 주입합니다.</p> |
773 | 775 | </details>
|
774 | 776 |
|
775 | 777 | <details>
|
776 | 778 | <summary>Spring Bean이란 무엇인가요?</summary>
|
777 | 779 | </br>
|
778 |
| - <p></p> |
| 780 | + <p>컨테이너 안에 들어있는 객체로 필요할 때 컨테이너에서 가져와서 사용합니다. `@Bean` 을 사용하거나 xml설정을 통해 일반 객체를 Bean으로 등록할 수 있습니다.</p> |
779 | 781 | </details>
|
780 | 782 |
|
781 | 783 | <details>
|
782 | 784 | <summary>스프링 Bean의 생성 과정을 설명해주세요.</summary>
|
783 | 785 | </br>
|
784 |
| - <p></p> |
| 786 | + <p>객체 생성 → 의존 설정 → 초기화 → 사용 → 소멸 과정의 생명주기를 가지고 있습니다. Bean은 스프링 컨테이너에 의해 생명주기를 관리하며 빈 초기화방법은 @PostConstruct 를 빈 소멸에서는 @PreDestroy 를 사용합니다.</p> |
| 787 | + <p>생성한 스프링 빈을 등록할 때는 ComponentScan을 이용하거나 @Configuration 의 @Bean 을 사용하여 빈 설정파일에 직접 빈을 등록할 수 있습니다.</p> |
785 | 788 | </details>
|
786 | 789 |
|
787 | 790 | <details>
|
788 | 791 | <summary>스프링 Bean의 Scope에 대해서 설명해주세요.</summary>
|
789 | 792 | </br>
|
790 |
| - <p></p> |
| 793 | + <p>빈 스코프는 빈이 존재할 수 있는 범위를 뜻하며 싱글톤, 프로토타입, request, session, application 등이 있습니다.</p> |
| 794 | + <p>싱글톤은 기본 스코프로 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프입니다.</p> |
| 795 | + <p>프로토타입은 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프입니다.</p> |
| 796 | + <p>request는 웹 요청이 들어오고 나갈때까지 유지하는 스코프, session은 웹 세션이 생성, 종료할때까지, application은 웹 서블릿 컨텍스와 같은 범위로 유지하는 스코프입니다.</p> |
791 | 797 | </details>
|
792 | 798 |
|
793 | 799 | <details>
|
|
799 | 805 | <details>
|
800 | 806 | <summary>DI 종류는 어떤것이 있고, 이들의 차이는 무엇인가요?</summary>
|
801 | 807 | </br>
|
802 |
| - <p></p> |
| 808 | + <p>DI는 세가지 방법이 있습니다. 생성자 삽입, Setter를 이용한 메소드 매개 변수 삽입, 필드 주입이 있습니다.</p> |
| 809 | + <p>생성자 주입은 생성자 호출시점에 딱 1번만 호출되는 것을 보장하며 불변, 필수 의존관계에 사용합니다.</p> |
| 810 | + <p>Setter주입은 선택, 변경 가능성이 있는 의존관계에 사용되며 스프링빈을 선택적으로 등록이 가능합니다.</p> |
| 811 | + <p>필드 주입은 `@Autowired` 를 사용하는데 외부에서 변경이 불가능하여 테스트 하기 힘듭니다. DI 프레임워크 없이는 작동하기 힘들며, 주로 애플리케이션과 관계없는 테스트코드나 `@Configuration` 같은 스프링 설정 목적으로 사용합니다. </p> |
803 | 812 | </details>
|
804 | 813 |
|
805 | 814 | <details>
|
|
847 | 856 | <details>
|
848 | 857 | <summary>POJO란 무엇인가요? Spring Framework에서 POJO는 무엇이 될 수 있을까요?</summary>
|
849 | 858 | </br>
|
850 |
| - <p></p> |
| 859 | + <p>POJO는 프레임워크 인터페이스, 클래스를 구현하거나 확장하지 않은 단순한 클래스로 Java에서 제공하는 API 외에 종속되지 않습니다. 특정 환경에 종속되지 않아 코드가 간결하고 테스트 자동화에 유리합니다.</p> |
851 | 860 | </details>
|
852 | 861 |
|
853 | 862 | <details>
|
|
879 | 888 | <details>
|
880 | 889 | <summary>JPA 영속성 컨텍스트의 이점(5가지)을 설명해주세요.</summary>
|
881 | 890 | </br>
|
882 |
| - <p></p> |
| 891 | + <p>영속성 컨텍스트는 엔티티를 영구 저장하는 환경을 의미합니다.</p> |
| 892 | + <p>영속성 컨텍스트를 쓰는 이유는 1차 캐시, 동일성 보장, 쓰기 지연, 변경감지(Dirty checking), 지연로딩이 있습니다.</p> |
| 893 | + <ul> |
| 894 | + <li>1차 캐시: 조회가 가능하며 1차 캐시에 없으면 DB에서 조회하여 1차 캐시에 올려 놓습니다.</li> |
| 895 | + <li>동일성 보장: 동일성 비교가 가능합니다.(==)</li> |
| 896 | + <li>쓰기 지연: 트랜잭션을 지원하는 쓰기 지연이 가능하며 트랜잭션 커밋하기 전까지 SQL을 바로 보내지 않고 모아서 보낼 수 있습니다.</li> |
| 897 | + <li>변경 감지(Dirty checking): 스냅샷을 1차 캐시에 들어온 데이터를 찍습니다. commit 되는 시점에 Entity와 스냅샷과 비교하여 update SQL을 생성합니다.</li> |
| 898 | + <li>지연 로딩: 엔티티에서 해당 엔티티를 불러올 때 그 때 SQL을 날려 해당 데이터를 가져옵니다.</li> |
| 899 | + </ul> |
| 900 | +</details> |
| 901 | + |
| 902 | +<details> |
| 903 | + <summary>JPA Propagation 전파단계를 설명해주세요.</summary> |
| 904 | + </br> |
| 905 | + <p>대기업면접에서 나왔던 질문으로 트랜잭션 고립단계와 같이 질문할 가능성이 있습니다.</p> |
| 906 | + <p>JPA Propagation은 트랜잭션 동작 도중 다른 트랜잭션을 호출(실행)하는 상황에 선택할 수 있는 옵션입니다.</p> |
| 907 | + <p>@Transactional의 propagation 속성을 통해 피호출 트랜잭션의 입장에서는 호출한 쪽의 트랜잭션을 그대로 사용할 수도 있고, 새롭게 트랜잭션을 생성할 수도 있습니다.</p> |
| 908 | + <p>REQUIRED(디폴트): 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 새로운 트랜잭션을 생성합니다.</p> |
| 909 | + <p>이 외에도 종류가 REQUIRES_NEW, SUPPORTS, MANDATORY, NOT_SUPPORT, NEVER, NESTED 가 있지만 신입이 실제로 다뤄본 경험이 적기 때문에 REQUIRED(디폴트)값만 답변했습니다.</p> |
883 | 910 | </details>
|
884 | 911 |
|
885 | 912 | <details>
|
|
913 | 940 | <details>
|
914 | 941 | <summary>싱글톤 패턴에 대해서 설명해주세요.(생각보다 어려움)</summary>
|
915 | 942 | </br>
|
916 |
| - <p></p> |
| 943 | + <p>전역 변수를 사용하지 않고 객체를 하나만 생성하도록 하며, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴입니다.</p> |
| 944 | + <p>하나의 인스턴스만을 생성하며 getInstance메서드로 모든 클라이언트에게 동일한 인스턴스를 반환합니다.</p> |
| 945 | + <p>private 생성자를 가지는 특징을 가지며, 생성된 싱글톤 오브젝트는 저장할 수 있는 자신과 같은 타입의 스태틱 필드를 정의합니다.</p> |
| 946 | + <p>가끔 면접에서 싱글톤 클래스를 만들라고 요구할 때도 있습니다. 그럴 때는 간단한 싱글톤 클래스를 준비하는게 좋습니다.</p> |
| 947 | +</details> |
| 948 | + |
| 949 | +<details> |
| 950 | + <summary>전략 패턴에 대해서 설명해주세요.</summary> |
| 951 | + </br> |
| 952 | + <p>인터페이스를 통해 통째로 외부로 분리시키고, 이를 구현한 구체적인 클래스를 필요에 따라 바꿔서 사용할 수 있게 하는 디자인 패턴입니다. 전략 패턴은 개방 폐쇄 원칙에 가장 잘 들어 맞는 패턴입니다.</p> |
917 | 953 | </details>
|
918 | 954 |
|
919 | 955 | <details>
|
|
0 commit comments