Skip to content

Commit dde2362

Browse files
authored
Merge pull request ksundong#10 from kses1010/master
docs: Java, Spring, CI/CD 추가
2 parents 6e38e6a + fd9085d commit dde2362

File tree

1 file changed

+116
-17
lines changed

1 file changed

+116
-17
lines changed

README.md

Lines changed: 116 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -591,7 +591,34 @@
591591
<details>
592592
<summary>JVM의 구조와 Java의 실행방식을 설명해주세요.</summary>
593593
</br>
594-
<p></p>
594+
<p>자바 가상 머신의 약자를 따서 줄여 부르는 용어로 JVM의 역할은 자바 애플리케이션을 클래스 로더를 통해 읽어 자바 API와 함께 실행하는 것입니다. 메모리 관리(GC)을 수행하며 스택기반의 가상머신입니다.</p>
595+
<p>JVM의 구조는 Class Loader, Exection engine, Runtime Data Area, JNI, Native Method Library로 이루어져 있습니다.</p>
596+
<ul>
597+
<li>클래스 로더: JVM내로 클래스를 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈</li>
598+
<li>실행 엔진: 바이트 코드를 실행시키는 역할</li>
599+
<ul>
600+
<li>인터프리터: 바이트 코드를 한줄 씩 실행합니다.</li>
601+
<li>JIT 컴파일러: 인터피르터 효율을 높이기 위한 컴파일러로 인터프리터가 반복되는 코드를 발견하면 JIT 컴파일러가 반복되는 코드를 네이티브 코드로 바꿔줍니다. 그 다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용합니다.</li>
602+
<li>GC(Garbage Collector): 가비지 컬렉터로 힙 영역에서 사용되지 않는 객체들을 제거하는 작업을 의미합니다.</li>
603+
</ul>
604+
<li>Runtime Data Areas: 프로그램 실행 중에 사용되는 다양한 영역입니다.</li>
605+
<ul>
606+
<li>PC Register: Thread가 시작될 때 생성되며 현재 수행 중인 JVM 명령의 주소를 갖고 있습니다.</li>
607+
<li>Stack Area: 지역 변수, 파라미터 등이 생성되는 영역. 실제 객체는 Heap에 할당되고 해당 레퍼런스만 Stack에 저장됩니다.</li>
608+
<li>Heap Area: 동적으로 생성된 오브젝트와 배열이 저장되는 곳으로 GC의 대상 영역입니다.</li>
609+
<li>Method Area: 클래스 멤버 변수, 메소드 정보, Type 정보, Constant Pool, static, final 변수 등이 생성됩니다. 상수 풀(Constant Pool)은 모든 Symbolic Reference를 포함하고 있습니다.</li>
610+
</ul>
611+
<li>JNI(Java Native Interface): 자바 애플리케이션에서 C, C++, 어셈블리어로 작성된 함수를 사용할 수 있는 방법을 제공해줍니다. Native 키워드를 사용하여 메서드를 호출합니다. 대표적인 메서드는 Thread의 currentThread()입니다.</li>
612+
<li>Native Method Library: C, C++로 작성된 라이브러리 입니다.</li>
613+
</ul>
614+
<p>Java의 실행방식
615+
<ul>
616+
<li>자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어 자바 바이트코드(.class)로 변환시킵니다.</li>
617+
<li>Class Loader를 통해 class 파일들을 JVM으로 로딩합니다.</li>
618+
<li>로딩된 class파일들은 Execution engine을 통해 해석됩니다.</li>
619+
<li>해석된 바이트코드는 Runtime Data Areas 에 배치되어 실질적인 수행이 이루어집니다.</li>
620+
</ul>
621+
</p>
595622
</details>
596623

597624
<details>
@@ -608,19 +635,26 @@
608635
<details>
609636
<summary>컬렉션 프레임워크에 대해서 설명해주세요.</summary>
610637
</br>
611-
<p></p>
638+
<p>Java Collection은 널리 알려져 있는 자료구조를 바탕으로 객체, 데이터들을 효율적으로 관리 할 수 있는 자료구조들이 있는 라이브러리를 컬렉션 프레임워크라고 합니다.</p>
639+
<p>List, Set은 Collection 인터페이스을 상속받지만, Map 인터페이스는 구조상의 차이라 별도로 정의합니다.</p>
612640
</details>
613641

614642
<details>
615643
<summary>제네릭에 대해서 설명해주세요.</summary>
616644
</br>
617-
<p></p>
645+
<p>제네릭은 자바의 타입 안정성을 맡고 있습니다. 컴파일 과정에서 타입체크를 해주는 기능으로 객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄여줍니다.</p>
618646
</details>
619647

620648
<details>
621649
<summary>애노테이션에 대해서 설명해주세요.</summary>
622650
</br>
623-
<p></p>
651+
<p>애노테이션은 인터페이스를 기반으로 한 문법으로 주석처럼 코드에 달아 클래스에 특별한 의미를 부여하거나 기능을 주입할 수 있습니다. built-in annotation은 상속받아서 메소드를 오버라이드 할 때 나타나는 @Override 애노테이션이 그 대표적인 예입니다.</p>
652+
<p>메타 애너테이션은 애노테이션을 선언할 때 사용하는 애노테이션입니다.</p>
653+
<ul>
654+
<li>@Retention: 애노테이션 유지 범위를 지정합니다. (소스, 클래스, 런타임)</li>
655+
<li>@Inherit: 애노테이션을 하위 클래스까지 전달여부를 지정합니다. 이 애노테이션이 있으면 하위 클래스까지 상속이 가능합니다.</li>
656+
<li>@Target: 해당 애노테이션을 어디에 사용할 지 결정합니다. (타입, 필드, 메서드, 파라미터, 생성자, 로컬변수, 애노테이션 타입)</li>
657+
</ul>
624658
</details>
625659

626660
<details>
@@ -635,13 +669,23 @@
635669
<details>
636670
<summary>인터페이스와 추상클래스의 차이점에 대해 설명해주세요.</summary>
637671
</br>
638-
<p></p>
672+
<p>추상클래스는 객체의 추상적인 상위 개념으로 공통된 개념을 표현할 때 사용합니다. 단일 상속만 가능합니다. 추상클래스를 상속하는 집합간에는 연관관계가 있습니다.</p>
673+
<p>인터페이스는 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용합니다. 다중 상속이 가능합니다. 인터페이스를 구현하는 집합간에는 관계가 없을 수 있습니다.</p>
639674
</details>
640675

641676
<details>
642677
<summary>클래스는 무엇이고 객체는 무엇인가요?</summary>
643678
</br>
644-
<p></p>
679+
<p>클래스는 객체를 정의하는 틀 또는 설계도와 같은 의미로 사용됩니다.</p>
680+
<p>객체는 식별 가능한 개체 또는 사물입니다. 객체는 구별 가능한 식별자, 특징적인 행동, 변경 가능한 상태를 가집니다. 인스턴스들을 통칭하는 용도로 사용합니다.</p>
681+
</details>
682+
683+
<details>
684+
<summary>정적(static)이란 무엇인가요?</summary>
685+
</br>
686+
<p>static은 클래스 멤버라고 하며, 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리됩니다.</p>
687+
<p>static 키워드를 통해 생성된 정적멤버들은 PermGen 또는 Metaspace에 저장되며 저장된 메모리는 모든 객체가 공유하며 하나의 멤버를 어디서든지 참조할 수 있는 장점이 있습니다.</p>
688+
<p>그러나, GC의 관리 영역 밖에 존재하기 때문에 프로그램 종료시까지 메모리가 할당된 채로 존재합니다. 너무 남발하게 되면 시스템 성능에 악영향을 줄 수 있습니다.</p>
645689
</details>
646690

647691
<details>
@@ -669,7 +713,11 @@
669713
<details>
670714
<summary>SOLID(객체지향 5대원칙)에 대해서 설명해주세요.</summary>
671715
</br>
672-
<p></p>
716+
<p>SRP(단일책임원칙)은 한 클래스의 하나의 책임만 가져야 합니다.</p>
717+
<p>OCP(개방-폐쇄 원칙)은 확장에는 열려 있으나 변경에는 닫혀 있어야 하며, 다형성을 활용해야 합니다.</p>
718+
<p>LSP(리스코프 치환 원칙)은 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야하는 원칙으로 상위 타입을 상속해서 재정의 했을 때 프로그램이 깨지지 않아야 합니다.</p>
719+
<p>ISP(인터페이스 분리 원칙)은 클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안되는 원칙입니다. 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 더 낫습니다. 즉, 비대한 인터페이스보단 더 작고 구체적인 인터페이스로 분리해야합니다.</p>
720+
<p>DIP(의존관계 역전 원칙)은 추상적인 것은 자신보다 구체적인 것에 의존하지 않고, 변화하기 쉬운 것에 의존해서는 안된다는 원칙입니다. 구체적으론 구현 클래스에 의존하지 말고, 인터페이스에 의존해야 하는 원칙입니다.</p>
673721
</details>
674722

675723
<details>
@@ -734,7 +782,8 @@
734782
<details>
735783
<summary>직렬화와 역직렬화에 대해서 설명해주세요.</summary>
736784
</br>
737-
<p></p>
785+
<p>직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트 형태로 데이터 변환하는 기술과 바이트로 변환된 데이터를 다시 변환하는 기술(역직렬화)을 아울러서 이야기 합니다.</p>
786+
<p>자바 직렬화는 JVM의 메모리에서만 상주되어있는 객체 데이터를 영속화(Persistence)가 필요할 때 사용됩니다. 시스템이 종료되더라도 없어지지 않는 장점을 가지며 영속화된 데이터이기 때문에 네트워크로 전송이 가능합니다.</p>
738787
</details>
739788

740789
<details>
@@ -764,25 +813,31 @@
764813
<details>
765814
<summary>Spring DI/IoC는 어떻게 동작하나요?</summary>
766815
</br>
767-
<p></p>
816+
<p>IoC(제어의 역전)은 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것으로 코드의 최종호출은 개발자가 제어하는 것이 아닌 프레임워크의 내부에서 결정된 대로 이루어집니다.</p>
817+
<p>DI(의존관계 주입)은 Spring 프레임워크에서 지원하는 IoC의 형태로 클래스 사이의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해줍니다.</p>
818+
<p>스프링에서는 스프링 컨테이너 ApplicationContext를 이용하여 설정 정보를 생성, 등록하고 필요한 객체를 생성자 혹은 setter를 통해 주입합니다.</p>
768819
</details>
769820

770821
<details>
771822
<summary>Spring Bean이란 무엇인가요?</summary>
772823
</br>
773-
<p></p>
824+
<p>IoC 컨테이너 안에 들어있는 객체로 필요할 때 IoC컨테이너에서 가져와서 사용합니다. @Bean 을 사용하거나 xml설정을 통해 일반 객체를 Bean으로 등록할 수 있습니다.</p>
774825
</details>
775826

776827
<details>
777828
<summary>스프링 Bean의 생성 과정을 설명해주세요.</summary>
778829
</br>
779-
<p></p>
830+
<p>객체 생성 → 의존 설정 → 초기화 → 사용 → 소멸 과정의 생명주기를 가지고 있습니다. Bean은 스프링 컨테이너에 의해 생명주기를 관리하며 빈 초기화방법은 @PostConstruct 를 빈 소멸에서는 @PreDestroy 를 사용합니다.</p>
831+
<p>생성한 스프링 빈을 등록할 때는 ComponentScan을 이용하거나 @Configuration 의 @Bean 을 사용하여 빈 설정파일에 직접 빈을 등록할 수 있습니다.</p>
780832
</details>
781833

782834
<details>
783835
<summary>스프링 Bean의 Scope에 대해서 설명해주세요.</summary>
784836
</br>
785-
<p></p>
837+
<p>빈 스코프는 빈이 존재할 수 있는 범위를 뜻하며 싱글톤, 프로토타입, request, session, application 등이 있습니다.</p>
838+
<p>싱글톤은 기본 스코프로 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프입니다.</p>
839+
<p>프로토타입은 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프입니다.</p>
840+
<p>request는 웹 요청이 들어오고 나갈때까지 유지하는 스코프, session은 웹 세션이 생성, 종료할때까지, application은 웹 서블릿 컨텍스트와 같은 범위로 유지하는 스코프입니다.</p>
786841
</details>
787842

788843
<details>
@@ -794,7 +849,10 @@
794849
<details>
795850
<summary>DI 종류는 어떤것이 있고, 이들의 차이는 무엇인가요?</summary>
796851
</br>
797-
<p></p>
852+
<p>DI는 세가지 방법이 있습니다. 생성자 삽입, Setter를 이용한 메소드 매개 변수 삽입, 필드 주입이 있습니다.</p>
853+
<p>생성자 주입은 생성자 호출시점에 딱 1번만 호출되는 것을 보장하며 불변, 필수 의존관계에 사용합니다.</p>
854+
<p>Setter주입은 선택, 변경 가능성이 있는 의존관계에 사용되며 스프링빈을 선택적으로 등록이 가능합니다.</p>
855+
<p>필드 주입은 `@Autowired` 를 사용하는데 외부에서 변경이 불가능하여 테스트 하기 힘듭니다. DI 프레임워크 없이는 작동하기 힘들며, 주로 애플리케이션과 관계없는 테스트코드나 `@Configuration` 같은 스프링 설정 목적으로 사용합니다. </p>
798856
</details>
799857

800858
<details>
@@ -842,7 +900,7 @@
842900
<details>
843901
<summary>POJO란 무엇인가요? Spring Framework에서 POJO는 무엇이 될 수 있을까요?</summary>
844902
</br>
845-
<p></p>
903+
<p>POJO는 프레임워크 인터페이스, 클래스를 구현하거나 확장하지 않은 단순한 클래스로 Java에서 제공하는 API 외에 종속되지 않습니다. 특정 환경에 종속되지 않아 코드가 간결하고 테스트 자동화에 유리합니다. 스프링에서는 도메인과 비즈니스 로직을 수행하는 대상이 POJO대상이 될 수 있습니다.</p>
846904
</details>
847905

848906
<details>
@@ -874,7 +932,25 @@
874932
<details>
875933
<summary>JPA 영속성 컨텍스트의 이점(5가지)을 설명해주세요.</summary>
876934
</br>
877-
<p></p>
935+
<p>영속성 컨텍스트는 엔티티를 영구 저장하는 환경을 의미합니다.</p>
936+
<p>영속성 컨텍스트를 쓰는 이유는 1차 캐시, 동일성 보장, 쓰기 지연, 변경감지(Dirty checking), 지연로딩이 있습니다.</p>
937+
<ul>
938+
<li>1차 캐시: 조회가 가능하며 1차 캐시에 없으면 DB에서 조회하여 1차 캐시에 올려 놓습니다.</li>
939+
<li>동일성 보장: 동일성 비교가 가능합니다.(==)</li>
940+
<li>쓰기 지연: 트랜잭션을 지원하는 쓰기 지연이 가능하며 트랜잭션 커밋하기 전까지 SQL을 바로 보내지 않고 모아서 보낼 수 있습니다.</li>
941+
<li>변경 감지(Dirty checking): 스냅샷을 1차 캐시에 들어온 데이터를 찍습니다. commit 되는 시점에 Entity와 스냅샷과 비교하여 update SQL을 생성합니다.</li>
942+
<li>지연 로딩: 엔티티에서 해당 엔티티를 불러올 때 그 때 SQL을 날려 해당 데이터를 가져옵니다.</li>
943+
</ul>
944+
</details>
945+
946+
<details>
947+
<summary>JPA Propagation 전파단계를 설명해주세요.</summary>
948+
</br>
949+
<p>대기업면접에서 나왔던 질문으로 트랜잭션 고립단계와 같이 질문할 가능성이 있습니다.</p>
950+
<p>JPA Propagation은 트랜잭션 동작 도중 다른 트랜잭션을 호출(실행)하는 상황에 선택할 수 있는 옵션입니다.</p>
951+
<p>@Transactional의 propagation 속성을 통해 피호출 트랜잭션의 입장에서는 호출한 쪽의 트랜잭션을 그대로 사용할 수도 있고, 새롭게 트랜잭션을 생성할 수도 있습니다.</p>
952+
<p>REQUIRED(디폴트): 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 새로운 트랜잭션을 생성합니다.</p>
953+
<p>이 외에도 종류가 REQUIRES_NEW, SUPPORTS, MANDATORY, NOT_SUPPORT, NEVER, NESTED 가 있지만 신입이 실제로 다뤄본 경험이 적기 때문에 REQUIRED(디폴트)값만 답변했습니다.</p>
878954
</details>
879955

880956
<details>
@@ -922,7 +998,27 @@
922998
<details>
923999
<summary>싱글톤 패턴에 대해서 설명해주세요.(생각보다 어려움)</summary>
9241000
</br>
925-
<p></p>
1001+
<p>전역 변수를 사용하지 않고 객체를 하나만 생성하도록 하며, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴입니다.</p>
1002+
<p>하나의 인스턴스만을 생성하며 getInstance메서드로 모든 클라이언트에게 동일한 인스턴스를 반환합니다.</p>
1003+
<p>private 생성자를 가지는 특징을 가지며, 생성된 싱글톤 오브젝트는 저장할 수 있는 자신과 같은 타입의 스태틱 필드를 정의합니다.</p>
1004+
<p>싱글톤 패턴의 문제점은 다음과 같습니다.</p>
1005+
<ul>
1006+
<li>의존 관계상 클라이언트가 구체 클래스에 의존합니다.</li>
1007+
<li>private 생성자 때문에 테스트가 어렵습니다.</li>
1008+
<li>객체 인스턴스를 하나만 생성해서 공유하는 방식 때문에 싱글톤 객체를 stateful하게 설계 했을 경우 큰 장애 발생요인이 됩니다.</li>
1009+
</ul>
1010+
<p>싱글톤의 단점을 해결하기 위해 무상태(stateless)로 설계해야 합니다.</p>
1011+
<ul>
1012+
<li>특정 클라이언트에 의존적인 필드가 있으면 안됩니다.</li>
1013+
<li>특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안됩니다.</li>
1014+
<li>가급적 읽기 전용으로 만들고, 필드 대신에 자바에서 공유되지 않는 지역변수, 파라미터, ThreadLocal 등을 사용합니다.</li>
1015+
</ul>
1016+
</details>
1017+
1018+
<details>
1019+
<summary>전략 패턴에 대해서 설명해주세요.</summary>
1020+
</br>
1021+
<p>인터페이스를 통해 통째로 외부로 분리시키고, 이를 구현한 구체적인 클래스를 필요에 따라 바꿔서 사용할 수 있게 하는 디자인 패턴입니다. 전략 패턴은 개방 폐쇄 원칙에 가장 잘 들어 맞는 패턴입니다.</p>
9261022
</details>
9271023

9281024
<details>
@@ -1025,7 +1121,10 @@ DevOps는 어쩌면 신입에겐 물어보지 않을 수도 있습니다. 하지
10251121
<details>
10261122
<summary>CI/CD가 무엇인가요? 왜 CI/CD가 장점이 될까요?</summary>
10271123
</br>
1028-
<p></p>
1124+
<p>보통 이 질문을 하는 동시에 어떤 CI/CD를 써봤는지 질문을 할 것입니다. 그때 썼던 CI/CD툴을 설명하고, 그 툴의 장단점을 설명하면 좋습니다.</p>
1125+
<p>코드 버전 관리를 하는 VCS 시스템에 push가 되면 테스트와 빌드가 수행되어 안정적인 배포파일을 만드는 과정을 CI(지속적 통합, continuous integration)이라고 하며, 이 빌드 결과를 자동으로 운영 서버에 배포까지 되는 과정을 CD(지속적 배포, continuous delivery or continuous deployment)라고 합니다.</p>
1126+
<p>푸시가 될 때마다 코드를 병합하고, 테스트 코드와 빌드를 수행하면서 자동으로 코드가 통합되어 더는 수동으로 코드를 통합할 필요가 없어져 개발에만 신경을 쓸 수 있습니다.</p>
1127+
<p>이 CI / CD의 중요한 것은 테스트 자동화입니다. 프로젝트의 완전한 상태임을 보장하기 위해 테스트 코드가 구현되어 있어야 합니다.</p>
10291128
</details>
10301129

10311130
<details>

0 commit comments

Comments
 (0)