diff --git a/algorithm/yij/Cryptography.md b/algorithm/yij/Cryptography.md new file mode 100644 index 0000000..45c82ea --- /dev/null +++ b/algorithm/yij/Cryptography.md @@ -0,0 +1,62 @@ +# Cryptography - 암호화 알고리즘 + +암호화 알고리즘은 암호화/복호화에 사용되는 키, 그리고 양방향 가능 유무를 기준으로 분류할 수 있다. + +
+ +## Symmetric-Key Algorithm + +대칭 키 암호는 암호화 알고리즘의 한 종류로, 암호화와 복호화에 같은 암호 키를 사용하는 알고리즘을 의미한다. + +암호화를 하는 송신자가 평문을 암호화 하고, 해당 암호 키를 공유해서 복호화를 하는 수신자는 암호문을 복원한다. 공유되는 암호 키를 **대칭 키**라고 한다. + +공개 키 암호화 방식과 비교해서 계산 속도가 빠르다는 장점이 있지만, 같은 키를 공유해야 하기 때문에 언젠가 한 번은 키를 전달해야 하는데, 전송 과정에서 탈취당할 수 있다는 위험성이 있다. + +
+ +## Public-Key Algorithm + +![image](https://user-images.githubusercontent.com/30489264/140643139-8248db2f-da1c-4cb1-9836-390596a47194.png) + +암호화와 복호화에 이용하는 키가 다른 방식을 말한다. 이 알고리즘은 공개 키 암호 또는 비대칭 암호라고 부른다. + +두 개의 키를 사용하는데 전체에서 공유하는 암호 키를 **공개 키**, 특정 사용자만이 가지고 있는 암호 키를 **개인 키**라고 한다. 어느 하나의 키로 암호화한 암호문은 다른 쪽의 키로 복호화할 수 있다. 대칭 키 암호보다 복잡한 계산을 사용하기 때문에, 실제에서는 대칭 키 방식과 혼합해서 사용한다. + +이 때 사용되는 방식은 두 가지가 있다. + +### 공개 키 암호 + +공개 키를 이용해서 암호화하고, 특정 개인 키를 가진 사용자만이 해당 암호문을 복호화할 수 있다. 대칭 키를 이용했을 때의 단점인 키의 공유가 발생하지 않기 때문에 두 단말 간에 정보를 안전하게 공유할 수 있다. + +> 1. A는 공개 키를 공개한다. +> 2. B는 공개 키로 전달하려는 평문을 암호화 한다. +> 3. B가 A에게 암호문을 전달한다. +> 4. A는 개인 키를 이용해서 암호문을 복호화한다. + +### 공개 키 서명 + +개인 키를 이용해서 암호화하고, 공개 키를 이용해서 해당 암호문을 복호화할 수 있다. 누구나 해당 암호문을 복호화할 수 있으므로, 개인 키를 가진 사용자로부터의 신뢰할 수 있는 정보인지 검증하는 용도로 쓰인다. + +> 1. A는 공개 키를 공개한다. +> 2. A는 평문을 자신의 개인 키로 암호화 한다. +> 3. 다른 사용자는 해당 암호문을 A의 공개 키를 이용해서 복호화한다. +> 4. 해당 문서가 변조되었다면 원래의 평문을 복원할 수 없으므로, 문서의 발행 출처와 변조 여부를 확인할 수 있다. + +
+ +## 대칭 키 + 비대칭 키 + +대칭 키 방식과 공개 키 암호 방식의 장단점이 명확하기 때문에 두 방식을 혼합해서 사용한다. + +1. 송신자 측에서는 대칭 키로 사용할 암호 키를 공개 키로 암호화한다. +2. 암호화된 대칭 키를 전송한다. 이 암호문은 수신자 측만 복호화할 수 있기에 탈취당해도 안전하다. +3. 수신자는 암호문을 복호화 해서 공개 키를 얻는다. +4. 송신자와 수신자가 공유한 대칭 키를 이용해서 이후에는 해당 대칭 키를 이용한 암호화 방식을 사용해서 통신한다. + +
+ +## One-Way Encryption + +![image](https://user-images.githubusercontent.com/30489264/140644145-735e0093-c662-4b42-8538-f04bc0cec6a2.png) + +위의 두 암호화 알고리즘은 암호 키를 사용해서 평문을 암호문으로 암호화, 암호문을 평문으로 복호화할 수 있었다. 하지만 **Cryptographic hash function(암호화 해시 함수)를 사용한 단방향 암호화 방식**은 평문을 암호화한 뒤로는 복호화할 수 없는 암호화 방식이다. 이 암호화 방식은 패스워드 저장과 같이, 반드시 원본 데이터를 복원해내지 않아도 되는 경우에 사용한다(ex. 서버의 데이터베이스에 저장하는 패스워드는 복호화 될 필요가 없고, 사용자가 패스워드를 입력할 때 마다 암호화 한 값을 비교하면 된다). \ No newline at end of file diff --git a/database/yij/README.md b/database/yij/README.md index d451e3b..4af53d7 100644 --- a/database/yij/README.md +++ b/database/yij/README.md @@ -2,15 +2,52 @@ - contributor : [김경원](https://github.com/shining8543) , [윤이진](https://github.com/483759) , [이현경](https://github.com/honggoii) , [진수연](https://github.com/jjuyeon)
+### :notebook_with_decorative_cover: 데이터베이스 성질 + +1. 데이터의 무결성에 대해 설명해주세요. + +> 무결성이란 데이터의 정확성, 일관성, 유효성이 유지되는 것을 말합니다. 종류로는 개체 무결성, 참조 무결성, 도메인 무결성, 무결성 규칙이 있습니다. + +2. 개체 무결성에 대해 설명해주세요. + +> 모든 테이블은 기본 키로 선택된 필드를 가져야 합니다. 이는 유니크한 값을 가져야 하며, NULL은 허용되지 않습니다. + +3. 참조 무결성에 대해 설명해주세요. + +> 참조 관계에 있는 두 테이블의 데이터가 일관성을 유지하도록 하는 것을 의미합니다. 참조 무결성을 지키기 위한 기능으로는 RESTRICTED, CASCADE, SET NULL이 있습니다. +> 이것은 해당 레코드를 참조하고 있는 개체가 있을 때 변경이나 삭제를 금지할지, 동기화 할지, NULL로 만들지 결정합니다. + +4. 도메인 무결성에 대해 설명해주세요. + +> 필드 타입, NULL 허용, Default 등의 사항을 정의하고 이를 확인하는 것을 말합니다. + +
+ ### :notebook_with_decorative_cover: 인덱스 (Index) 1. DB 인덱스에 대해 설명해주세요. - - 데이터베이스에서 풀 스캔이 아닌 레인지 스캔을 하기 위해 지정하는 자료구조. + + > 데이터베이스에서 레코드를 조회할 때 풀 스캔이 아니라 범위 스캔을 하기 위해 지정하는 자료구조입니다. 인덱스를 사용할 경우 일반 테이블이 아닌 B-Tree로 구현된 파일에서 내용을 검색하기 위해 조회 속도를 증가시킬 수 있습니다. + +
+ 2. DB 인덱스를 사용하는 이유는 무엇인가요? - - 테이블을 조회할 시 SQL문의 수정 없이 빠른 속도로 조회하기 접근하기 위해 -3. DB 인덱스에 해쉬 보다 B Tree를 쓰는 이유는 무엇인가요? - - B+트리를 사용하게 되면 banlanced 성질이 유지되어 데이터의 속성에 관계 없이 일관된 시간복잡도 내에 조회 가능. 해쉬는 해쉬 버킷의 일부 영역에만 데이터가 집중되는 경향이 있어 cache miss가 발생할 확률이 높음. + +> 자주 조회하는 컬럼을 인덱스로 등록하면 조회 속도를 상승시킬 수 있습니다. 단, 삽입과 삭제가 빈번하게 발생할 경우 성능 저하의 원인이 될 수 있으며, 카디널리티가 높은 컬럼에 인덱스를 지정해야 합니다. + +3. 카디널리티가 무엇인가요? + +> 컬럼의 값이 중복되지 않으면 카디널리티가 높다고 합니다. 예를 들어 성별 컬럼은 값이 제한되어 있기 때문에 카디널리티가 낮고, 주민등록번호의 경우는 카디널리티가 높습니다. + +
+ +4. DB 인덱스에 해쉬 보다 B Tree를 쓰는 이유는 무엇인가요? + +> B+트리를 사용하게 되면 banlanced 성질이 유지되어 데이터의 일관된 시간복잡도 내에 조회 가능. 해쉬는 해쉬 버킷의 일부 영역에만 데이터가 집중되는 경향이 있어 cache miss가 발생할 확률이 높음. + +
### :notebook_with_decorative_cover: 관계형 DB vs 비관계형 DB + 1. 관계형 DB 와 비관계형 DB 의 차이점에 대해 설명해주세요. - 관계형 DB는 1️⃣정해진 데이터 스키마에 따라 테이블에 저장되며 2️⃣관계를 통해 여러 테이블에 분산된다는 특징이 있다. 따라서 스키마를 준수하지 않은 레코드는 테이블에 추가할 수 없다. 비관계형 DB는 그에 반해 스키마도 없고, 관계도 없다. 레코드가 아닌 문서(documents)라고 부르며, json과 비슷한 형태의 관련된 데이터들을 동일한 컬렉션에 저장한다. 2. RDBMS과 비교하였을 때 NoSQL의 장점을 설명해보세요. @@ -23,6 +60,9 @@ - 데이터베이스를 수평으로 확장해야 하는 경우 ### :notebook_with_decorative_cover: 트랜잭션 (Transaction) + +
+정리 #### 트랜잭션이란? ------ 데이터베이스 관리 시스템에서 하나의 논리적 작업 단위를 구성하는 일련의 연산들의 집합이다. @@ -97,6 +137,50 @@ Transaction1이 Table B의 첫 번째 레코드의 lock을 얻고, Transaction2 - Serializable (Level 3): 트랜잭션이 완료될 때 까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸린다. 완벽한 Read 일관성 모드를 제공한다
+ +
+ +
+ +1. 트랜잭션이 무엇인가요? + +> 트랜잭션이란 하나의 논리적 수행 단위를 이루는 연산들의 집합을 의미합니다. 계좌 이체를 예를 들었을 때, 출금 계좌에서 돈을 꺼내는 작업과 입금 계좌로 돈을 넣는 작업 두 연산으로 이루어져 있습니다. 트랙잭션을 수행했을 때 내부의 모든 연산이 정상적으로 수행돼서 적용되거나, 실패했을 때는 수행하기 전 상태를 보장해야 합니다. + +
+ +2. 트랜잭션의 ACID 성질에 대해 설명해주세요. + +> 원자성, 일관성, 독립성, 지속성 네 가지의 성질로 이루어져 있습니다. +> 원자성이란 트랜잭션의 모든 연산들이 정상적으로 수행되어 반영되거나, 어떠한 연산도 수행되지 않은 상태를 보장해야 하는 것을 의미합니다. +> 일관성이란 트랜잭션의 수행 전 후에 데이터베이스의 무결성과 같은 상태가 유지되어야 하는 것 입니다. +> 독립성이란 트랜잭션은 다른 트랜잭션의 병렬적 수행에 영향 받지 않아야 하는 것을 말합니다. +> 지속성이란 트랜잭션이 성공적으로 완료되서 커밋되면, 이는 어떤 장애가 발생하더라도 보존되어야 한다는 것을 의미합니다. + +
+ +3. 트랜잭션을 병행 처리할 때 문제점에 대해 설명해주세요. + +> 두개의 트랜잭션이 병렬적으로 수행될 때, 하나의 트랜잭션에서 문제가 생겨 롤백을 해야된다면 다른 트랜잭션이 문제가 없음에도 같이 취소되어 버리는 현상이 발생할 수 있습니다. + +4. 위의 질문의 해결 방법을 얘기해주세요. + +> Locking을 통해 트랜잭션이 특정 레코드를 점유중일 때 다른 트랜잭션이 이에 접근하지 못하게 하는 방법이 있습니다. +> 락의 단위가 너무 크면 트랜잭션이 직렬적으로 수행되어서 실행 시간이 느려진다는 단점이 있고, 너무 작으면 독립성이 보장받지 못할 수 있습니다. + +5. 공유락과 배타락에 대해 설명해주세요. + +> 공유락은 읽기를 할 때 사용되는 락의 종류입니다. 트랜잭션이 데이터를 조회할 때 공유락을 걸게 되면, 다른 트랜잭션은 그 데이터를 읽을 수 있고 변경이나 삭제는 불가능합니다. 배타락은 수정/삭제를 할 때 거는 락의 종류입니다. 배타락을 걸게 되면 다른 트랜잭션은 그 데이터에 읽기/수정/삭제 연산을 할 수 없고, 어떠한 락도 걸 수 없습니다. + +6. 트랜잭션 격리 수준의 레벨에 대해 얘기해주세요. + +> 트랜잭션 격리 수준은 네 단계로 이루어집니다. SQL 서버에서 대표적으로 사용하는 Read-Commited 레벨에 대해서만 설명드리자면, 자신이 데이터를 읽는 동안 공유락을 걸어 다른 트랜잭션이 이를 수정할 수 없게끔 하는 레벨입니다. + +6. 트랜잭션에 의해 발생하는 데드락을 설명해주세요. + +> 두 개 이상의 트랜잭션이 각자가 가진 데이터에 대해 락을 걸고 요구하는 자원이 사이클을 띠고 있는 것을 말합니다. + +
+
### :notebook_with_decorative_cover: 데이터 모델링 @@ -109,10 +193,24 @@ Transaction1이 Table B의 첫 번째 레코드의 lock을 얻고, Transaction2 3. 위에서 답변한 스키마 중에서 어떤 것이 더 낫습니까? ### :notebook_with_decorative_cover: 정규화 (Normalization) -1. 정규화란 무엇인지, 필요한 이유와 함께 답변해주세요. - - 한 릴레이션에 여러 엔티티의 어트리뷰트들을 혼합하게 되면 정보가 중복 저장되며, 저장 공간을 낭비할 수 있다. 또한 중복된 정보로 인해 갱신 이상이 발생하게 된다. 따라서 관계형 데이터베이스에서 중복을 최소화하기 위해 데이터를 구조화하는 작업을 정규화라고 한다. -2. 각 정규화 단계에 대해 **만족되어야 할 조건**을 중심으로 설명해주세요. - - 제1정규형: 어트리뷰트의 도메인이 오직 원자값 만을 포함하고, 튜플의 모든 어트리뷰트가 도메인에 속하는 하나의 값을 가져야 한다. - - 제2정규형: 모든 비주요 어트리뷰트들이 키 어트리뷰트에 대해 완전 함수적 종속이다. - - 제3정규형: 어떠한 비주요 어트리뷰트도 기본키에 대해 이행적으로 종속되지 않는다 - - BCNF정규형: 여러 후보 키가 존재하는 릴레이션에 해당하는 정규화 내용. \ No newline at end of file + +1. 함수적 종속 관계에 대해 설명해주세요. + +> (테이블의 모든 컬럼에 대해 X가 Y를 결정할 수 있으면 Y가 X에 함수적으로 종속되었다고 말합니다.) +> 부분 함수적 종속은 종속자가 결정자의 전체가 아닌 일부분에도 함수적 종속이 되는 것입니다. 완전 함수적 종속은 그에 반해 전체에 대해서만 함수적 종속이 되는 것입니다. + +2. 이상 현상에 대해 설명해주세요. + +> 테이블이 잘못 설계되면 삽입 이상, 수정 이상, 삭제 이상 현상이 나타납니다. 이를 방지하기 위해 테이블을 적절하게 정규화 하는 것이 필요합니다. +> 삽입 이상이란 새 데이터를 삽입하기 위해 불필요한 필드까지 함께 삽입해야 하는 현상입니다. +> 수정 이상이란 중복된 데이터 중 일부만 변경해서 데이터의 불일치가 발생하는 현상입니다. +> 삭제 이상이란 레코드를 삭제하기 위해 필요한 데이터들도 함께 삭제되어버리는 현상입니다. + +3. 정규화란 무엇인지, 필요한 이유와 함께 답변해주세요. + +> 릴레이션이 저장 공간을 낭비하고 이상 현상이 발생하는 것을 막기 위해 테이블을 분리해서 데이터를 구조화하는 작업을 정규화라고 합니다. + +4. 각 정규화 단계에 대해 **만족되어야 할 조건**을 중심으로 설명해주세요. + +> 제1정규형은 모든 어트리뷰트의 레코드가 하나의 값만을 가지는 것입니다. +> 제2정규형은 기본키가 아닌 어트리뷰트들이 기본키 컬럼에 대해 완전 함수적 종속인 것을 말합니다. diff --git a/java/README.md b/java/README.md index 87579d2..3131eaf 100644 --- a/java/README.md +++ b/java/README.md @@ -11,7 +11,7 @@ 6. 클래스는 무엇이고, 객체는 무엇인지 설명해주세요. 7. 인터페이스와 추상클래스의 차이점은 무엇인지 설명해주세요. 8. 직렬화가 무엇인지 설명하세요. -9. Call by Value와 Call by Reference의 차이에 대해 설명해주세요. +9. Call by Value와 Call by Reference의 차이에 대해 설명해주세요. 10. Checked Exception과 Unchecked Exception의 차이를 설명해주세요. 11. JVM의 역할에 대해 설명해주세요. 12. JDBC란 무엇인가요? diff --git a/java/yij/Immutable.md b/java/yij/Immutable.md new file mode 100644 index 0000000..92bdecb --- /dev/null +++ b/java/yij/Immutable.md @@ -0,0 +1,126 @@ +# Immutable Object + +Spring의 Constructor Dependency Injection, Java Collection의 String, Multi-Thread에서 Thread-Safe를 구현하는 방법, Builder Pattern의 장점 등등에서 공통적으로 언급하는 단어는 바로 **Immutable**이다. + +Java와 Java 기반 프레임워크의 많은 원칙들은 객체를 Immutable하게 만드는 것을 중요한 목표로 삼는다. + +그럼 객체가 어떨 때 Immutable하다고 하는 것인지, 그것의 장점은 무엇인지를 알아야 자바에 대해 잘 이해하고 있는게 아닐까 🙄 라는 생각에 또 조사해봤다. + +
+ +## Immutable Object란? + +**객체가 처음 생성된 이후, 상태가 변하지 않고 일정하게 유지되는 것**을 Immutable Object(이후 불변 객체)라고 한다. + +실제 개발 시, 객체가 Immutable하게 정의되면 API를 사용했을 때 해당 인스턴스의 라이프 사이클 동안 완전히 같은 방식으로 작동할 것을 보장한다. + +`java.lang.String`은 메서드를 통해 객체의 값을 변경할 수 있는 것 처럼 보여도, 원본 문자열 자체는 변하지 않는다(자세한 내용은 [링크](https://www.javatpoint.com/immutable-string) 참조). + +
+ +```java +String name = "baeldung"; +String newName = name.replace("dung", "----"); + +assertEquals("baeldung", name); +assertEquals("bael----", newName); +``` + +
+ +이를 위해 객체는 Read-Only 메서드를 제공하며 객체의 내부 상태를 변경하는 메서드를 포함해서는 안된다. + +
+ +## *final* Keyword in Java + +자바에서 불변성을 언급할 때에는 `final` keyword가 항상 등장한다. + +변수는 기본적으로 mutable하기 때문에 값을 자유롭게 변경할 수 있다. 단, `final` 키워드를 함께 사용해서 선언할 때는 변경을 시도했을 때 자바 컴파일러가 컴파일 오류를 보고한다. + +```java +final String name = "baeldung"; +name = "bael..."; // compile error + +final List strings = new ArrayList<>(); +assertEquals(0, strings.size()); +strings.add("baeldung"); +assertEquals(0, strings.size()); // fail +``` + +하지만 `final`은 정확하게는 **변수가 가지고 있는 레퍼런스를 변경하는 것을 금지**하기 때문에, 객체의 내부 상태를 변경하는 것은 보호할 수 없다. + +그래서 위의 예제에서 `strings` 리스트에는 새 element가 들어갈 수 있고, size는 1로 증가해서 두 번째 `assertEquals()` 메서드는 실패한다. 따라서 `strings`는 Immutable 객체가 아니다. + +
+ +### List를 Immutable Object로 만들기 + +```java +List<> +``` + +
+ +## Immutability in Java + +변수의 value를 변경하는 것에 주의해야 한다는 점을 알면 불변 객체의 API를 구현할 수 있다. + +이것은 **API의 사용에 관계없이 내부 상태가 절대 변하지 않음**을 보장해야 함을 의미한다. + +많은 경우에서 이는 필드에 `final`을 사용해서 구현한다. + +```java +class Money { + private final double amount; + private final Currency currency; + + // ... +} +``` + +(모든 Primitive Data Type의 경우를 포함) amount의 값은 변하지 않는다. 단, `currency` 인스턴스가 변하지 않음을 보장하지만, Currency 클래스의 API에 의존해서 불변을 보장하는지 함께 검증해야 한다. + +```java +class Money { + // ... + public Money(double amount, Currency currency) { + this.amount = amount; + this.currency = currency; + } + + public Currency getCurrency() { + return currency; + } + + public double getAmount() { + return amount; + } +} +``` + +불변 API의 요구사항을 만족하기 위해 `Money` 클래스는 Read-Only 메서드만 가진다. reflection API(모름)를 이용하면 불변성을 깰 수 있는데, 이것은 불변 객체의 성질을 위반하기 때문에 조심해야 한다. + +
+ +## Benefits + +불변 객체가 가지는 가장 큰 장점은 Multi-Thread 환경에서의 안정성을 보장하는 것 이라고 생각한다. Multi-Thread 환경에서 여러 쓰레드가 공유 자원에 접근할 때, 해당 필드가 변할 가능성이 있다면 일관성이 깨질 수 있다. 필드를 불변하게 만들어주는 것은 Thread-safe를 구현하는 가장 쉬운 방법 중 하나이다. + +객체지향 관점에서 봤을 때는 외부에서 객체의 상태를 변경할 수 있는 권한을 축소하기 때문에 더 자율적인 객체를 만들 수 있다. + +
+ +## 참고자료 + +> https://www.baeldung.com/java-immutable-object +> https://tecoble.techcourse.co.kr/post/2020-05-18-immutable-object/ + +
+ +## 정리 + +> Immutable이 무엇이며 왜 중요한가? +> Java에서 Immutable이란 객체가 처음 생성된 이후 상태가 변하지 않음을 의미한다. 이는 여러 쓰레드가 불변 객체에 동시에 접근을 해도 값이 변하지 않기 때문에 Thread-Safe를 구현하는 유용한 방법이 될 수 있다. + +
\ No newline at end of file diff --git a/java/yij/README.md b/java/yij/README.md index f4b4038..e3161c8 100644 --- a/java/yij/README.md +++ b/java/yij/README.md @@ -43,7 +43,8 @@ 3-3. Major GC 알고리즘에 대해 설명해주세요. > Parallel GC -> : Mark-Sweep-Compact 알고리즘을 사용해서 살아남은 객체를 식별하고, 참조되지 않는 객체는 해제한 뒤, 선택적으로 메모리를 재배열합니다. 이 과정을 여러개의 쓰레드를 이용해서 가비지 컬렉션을 하는 알고리즘이 Parallel GC입니다. +> : Mark-Sweep-Compact 알고리즘을 사용해서 살아남은 객체를 식별하고, 참조되지 않는 객체는 해제한 뒤, 선택적으로 메모리를 재배열합니다. 이 과정을 여러개의 쓰레드를 이용해서 가비지 컬렉션을 하는 알고리즘이 Parallel GC입니다. +> > G1GC > : 힙을 일정한 크기의 영역들로 나누어서 사용하던 영역이 꽉 차면 GC를 실행하고 다른 영역으로 이동시키는 알고리즘입니다. 자바 9부터 JVM의 기본 GC 알고리즘으로 사용하고 있으며, 다른 GC 알고리즘에 비해 STW 시간이 짧다는 장점이 있습니다. diff --git a/java/yij/Singleton.md b/java/yij/Singleton.md new file mode 100644 index 0000000..70ba6df --- /dev/null +++ b/java/yij/Singleton.md @@ -0,0 +1,4 @@ +# Singleton + +: 클래스의 인스턴스를 하나만 생성하고, 어디서든 그 인스턴스를 참조할 수 있도록 하는 패턴 +생성자가 여러 번 호출되더라도 실제로 생성되는 객체는 하나 \ No newline at end of file diff --git a/spring/yij/Dependency.md b/spring/yij/Dependency.md index 37d527f..f02f66c 100644 --- a/spring/yij/Dependency.md +++ b/spring/yij/Dependency.md @@ -1,6 +1,7 @@ > [💡](#ioc---inversion-of-control) Spring의 IoC, DI에 대해 설명해주세요 -> 👉 객체 간의 의존성을 코드 내에 구현하면, 클래스의 변경이 발생할 때 해당 클래스를 참조하는 클래스의 코드 또한 모두 변경해야 합니다. 따라서 유지보수성을 증가시키고, 객체 간의 의존 관계를 컴파일 시간이 아닌 런타임에 설정함으로서 객체 간 결합도를 떨어뜨려 유지보수성을 증가시키는 방식을 IoC라고 합니다. 스프링에서는 IoC 컨테이너가 의존성 주입을 통해 이를 구현했습니다. -> 스프링의 의존성 주입 방식은 생성자 주입, 세터 주입 방식이 있습니다. 일반적으로 객체의 불변성 성질을 지킬 수 있고 필드의 NPE가 발생하는 것을 막기 위한 생성자 주입 방식이 권장됩니다. +> 👉 객체 간의 의존성을 코드 내에 구현하면, 클래스의 변경이 발생할 때 해당 클래스를 참조하는 클래스의 코드 또한 모두 변경해야 한다. 이는 유지보수성을 떨어뜨리는 일이다. IoC(Inversion of Control)은 객체 간의 의존 관계를 컴파일 시간이 아닌 런타임에 설정함으로서 객체 간 결합도를 떨어뜨려 유지보수성을 증가시키는 방식이다. 스프링에서는 IoC 컨테이너가 DI(Dependency Injection - 의존성 주입)을 통해 이를 구현했다. +> 스프링의 의존성 주입 방식은 생성자 주입, 세터 주입 방식이 있다. 일반적으로 객체의 불변성 성질을 지킬 수 있고 필드의 NPE가 발생하는 것을 막기 위한 생성자 주입 방식이 권장된다. +> Annotation을 이용한 필드 주입 방식도 존재하지만, 이는 Spring IoC 컨테이너가 로드되고 어노테이션을 설정한 필드의 클래스에 일치하는 의존성이 주입된다. 즉, Spring IoC 컨테이너가 실행되지 않으면 객체를 생성할 수 없다.
@@ -14,7 +15,7 @@ 컨테이너는 빈을 생성할 때 의존성을 주입하므로 Compile Time이 아닌 Runtime에 객체 간의 의존 관계가 결정된다. 따라서 객체 간의 관계가 느슨하게 연결된다(loose coupling). -`org.springframework.beans`와 `org.springframework.context` package는 Spring Framework의 IoC 컨테이너를 담당합니다. +`org.springframework.beans`와 `org.springframework.context` package는 Spring Framework의 IoC 컨테이너를 담당한다. - `BeanFactory` : 모든 유형의 객체를 관리할 수 있는 configuration 메커니즘 제공 - `ApplicationContext` : `BeanFactory`를 상속받은 Sub-Interface diff --git a/spring/yij/README.md b/spring/yij/README.md new file mode 100644 index 0000000..6b381b0 --- /dev/null +++ b/spring/yij/README.md @@ -0,0 +1,51 @@ +# 6) Spring +- contributor : [김경원](https://github.com/shining8543) , [윤이진](https://github.com/483759) , [진수연](https://github.com/jjuyeon) +
+ +### :notebook_with_decorative_cover: Spring +1. Spring MVC 구조 흐름에 대해 과정대로 설명해주세요. + +> 1️⃣ 클라이언트는 디스패처 서블릿에게 요청합니다. +> 2️⃣ 디스패처 서블릿은 어떤 컨트롤러가 요청을 처리할 수 있을지 핸들러 매핑을 이용해서 URI를 분석해서 알아냅니다. +> 3️⃣ 해당 요청을 특정한 컨트롤러에게 전달합니다. +> 4️⃣ 컨트롤러는 비즈니스 로직을 통해 요청을 처리한 뒤 수행 결과를 반환합니다. +> 5️⃣ 디스패처 서블릿은 수행 결과를 표현할 뷰 이름을 뷰리졸버에게 전달합니다. +> 6️⃣ 뷰 리졸버는 이를 처리할 수 있는 경로와 확장자 정보를 담아 반환합니다. +> 7️⃣ 디스패처 서블릿은 뷰에게 응답 결과를 담아 전달합니다. +> 8️⃣ 뷰는 클라이언트에게 응답 결과를 담아 화면을 표현합니다. + +
+ +2. Spring DI에 대해 설명해주세요. + +> DI는 Dependency Injection의 약자로, 객체 인스턴스의 생성/관리/소멸을 사용자가 아닌 컨테이너가 관리하는 것을 말합니다. +> 인스턴스의 생성과 객체의 선언을 분리해서 결합도를 낮춥니다. 이는 프로그램의 유지보수성과 확장성을 증가시킬 수 있습니다. + +
+ +3. Spring과 Spring Boot의 차이점에 대해 설명해주세요. + +> 스프링 부트는 스프링 기반 애플리케이션을 더 쉽게 구현할 수 있도록 해주는 프레임워크입니다. 기존 xml 기반으로 설정을 해주어야 했던 부분을 빌드 파일을 이용해서 쉽게 관리해서 권장 버전으로 설정해줍니다. 또한 톰캣을 내장 서버로 가지고 있어 WAS 서버를 직접 지정해주지 않아도 됩니다. + +
+ +4. Filter와 Interceptor의 차이점에 대해 설명해주세요. + +> + +
+ +5. 영속성 컨텍스트에 대해 설명해주세요. +6. Spring에서 CORS 에러를 해결하기 위해 했던 방법은 무엇인가요? +7. Bean/Component 어노테이션은 무엇이며, 둘의 차이점은 무엇인가요? +8. Spring Triangle의 POJO와 AOP에 대해 설명해주세요 +9. Hibernate에 대해서 설명하세요 + +### :notebook_with_decorative_cover: JPA +1. JPA Propagation 전파단계를 설명해주세요. +2. N+1 문제가 발생하는 이유와 이를 해결하는 방법을 설명해주세요. + +### :notebook_with_decorative_cover: Design Pattern +1. Builder 패턴에 대해서 설명하세요. +2. MVC1과 MVC2 패턴의 차이를 설명해 주세요. +3. (꼬리질문) 그렇다면, Spring MVC 는 무엇일까요? \ No newline at end of file diff --git a/web/yij/mvc.md b/web/yij/mvc.md new file mode 100644 index 0000000..cffa712 --- /dev/null +++ b/web/yij/mvc.md @@ -0,0 +1,123 @@ +
+👉 서론 + +학부생 때 수강했던 과목은 많았지만 실제 현업에서의 프로그래밍에 대해 깊이있게 다뤘던 수업은 많지 않았다. + +3학년 1학기 때 Model1 구조 기반으로 실습했었는데 그 때는 웹개발이란 원래 그런건 줄 알고 모든 프로젝트를 JSP를 사용해서 jsp 파일 안에 비즈니스 로직을 때려넣었었다... + +심지어 4학년 2학기에 스프링을 처음 써봤는데 컨트롤러가 뭔지도 모르고 RequestMapping되는 방식을 몰라서 한참을 헤맸던 기억이 난다 + +물론 이번년도에 공부했던 것 처럼 JSP, 서블릿, MVC 패턴, Spring, Spring Boot에 대해 왜 이런 기술이 나왔는지 핵심 철학은 무엇인지 차근차근 배웠다면 더 좋았겠지만 + +오히려 '아 이 땐 이렇게 했었는데 잘못된 방식이었구나'를 느낄 수 있는 지금도 나쁘지 않다 ^^ + +
+ +## Web Application Server + +JSP와 Servlet을 다루기 전, Web Application Server(WAS)에 대해 아래의 IBM 링크를 읽는 걸 추천 ❗😮 + +[Web Server 🆚 Application Server 🆚 Web Application Server](https://www.ibm.com/cloud/learn/web-server-vs-application-server) + + +간단하게 정리하면 다음과 같다 + +### 웹 서버 + +웹 브라우저의 HTTP 요청에 대한 응답으로 정적 웹 콘텐츠(HTML pages, file, image, video 등)를 제공하는 서버 + +### 애플리케이션 서버 + +웹 콘텐츠도 전달할 수 있지만 클라이언트와 서버 측 코드 간의 상호작용을 활성화시켜 동적 콘텐츠를 생성하고 전달하기 위한 서버 + +### 웹 애플리케이션 서버 + +실제 사용에서는 위의 두 서버의 경계가 모호해졌고, 웹 애플리케이션의 성능이 중요해지면서 등장함. 두 서버를 분리하지 않고 정적 웹 콘텐츠와 동적 응용 프로그램 컨텐츠를 함께 제공하는 서버 + +우리가 가장 많이 사용하는 WAS로는 [Nginx](https://nginx.org/en/)와 [Apache Tomcat](https://tomcat.apache.org/)이 있다. + +Nginx는 리버스 프록시, 로드 밸런싱, HTTP 캐싱을 주로 지원하고 +Apache Tomcat은 **자바 서블릿을 실행**하고 **JSP코드가 포함된 웹 페이지를 렌더링**/전달하고 Java EE(Enterprise Edition)애플리케이션을 제공한다. + +
+ +## Servlet + +Java를 사용하여 웹 페이지를 동적으로 생성할 수 있는 서버 프로그램으로, Java 클래스의 일종 + +### Servlet의 특징 + +- 서블릿 컨테이너가 **클라이언트의 요청을 받을 때 독립된 쓰레드를 생성**하여 다중 쓰레드를 제공한다 +- 프로토콜에 관계 없이 여러 애플리케이션 기반의 서버 응용 프로그램을 구현할 수 있다 + - 주로 HTTP 프로토콜 기반의 서블릿 프로그램을 주로 구현 +- 서블릿 표준 API에서 제공하는 추상 클래스와 인터페이스 기반의 클래스를 제공하기 때문에 특정 서블릿 컨테이너에 종속되지 않는다 +- 대표적인 서블릿 컨테이너로 **Apache Tomcat**이 있다 +- 하나의 HTTP Request 요청을 처리하는 서블릿 인스턴스는 컨테이너에 의해 **싱글톤**으로 관리된다. + - Request와 관련된 작업을 마친 서블릿 인스턴스는 스레드풀에 들어가거나 (destroy메서드 호출 뒤) GC의 대상이 된다. + + +### HTTP protocol - Servlet 동작 과정 + +![image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F28fe562e-efea-4726-a6b7-b93f9d77aa84%2FUntitled.png?table=block&id=2bab2235-618c-45bc-b2db-786dc2d9fb31&spaceId=11280ec7-1c04-494f-8388-43ed5ddfcb0a&width=1600&userId=e567590d-ab63-42a6-869b-009383fc3d4f&cache=v2) + +1. Web Client가 Web Server에게 **HTTP Request** 메시지를 보낸다. + - 필요에 따라 매개변수, 쿠키 정보를 같이 보낼 수 있다 +2. Web Server는 HTTP Request 메시지를 해석하여 서블릿에 대한 요청일 경우 **서블릿 컨테이너에게 (네트워크를 통해) Request를 전달**한다. + - WS가 실행되는 컴퓨터와 서블릿 컨테이너가 실행되는 컴퓨터가 달라도 된다 +3. 서블릿 컨테이너는 Web Server로부터 HTTP Request를 전달받아 해당 요청을 처리할 수 있도록 **서블릿을 생성하여 service() 메서드를 호출**한다. +4. 서블릿(컨테이너에 의해 인스턴스화된)은 필요에 따라 init() 메서드를 호출하여 초기화하고, 실제 서비스를 수행하기 위한 service() 메서드를 호출할 수 있다. +5. 서비스를 수행한 후 처리 결과를 알려주기 위한 **결과 페이지를 Web Server에게 전달**한다. +6. Web Server는 서블릿 컨테이너로부터 전달받은 **결과 페이지를 Web Client에게 HTTP Response로 보낸다**. + +### Servlet 예시 + +![image](https://user-images.githubusercontent.com/30489264/136686866-3c040626-38af-4b79-8c56-9e4942d69795.png) + +3학년 수업할 때 캡쳐한 사진?이 있길래 가져와봤다 ^^ + +이처럼 서블릿을 이용해서 Java 코드 안에 HTML을 넣어서 웹 페이지를 동적으로 생성할 수 있지만, `out.println`메서드가 중복되어 가독성이 심각하다. + +그래서 Servlet으로 바로 웹 페이지를 만들기 보다는 JSP를 이용해서 웹 페이지를 동적으로 생성하고, 그것을 서블릿 형태로 변환해서 구현하는 게 일반적이다. + +
+ +## JSP (Java Server Page) + +HTML 문서에 Java 코드를 포함하여 웹 서버에서 동적인 웹 페이지를 생성할 수 있게 하는 도구 + +실행 시 서블릿으로 변환되어 실행되며, 서블릿과 달리 HTML 표준에 의해 작성되기 때문에 개발에 용이하다. + +비슷한 구조로 PHP, ASP, ASP.NET 등이 있지만 현재는 많이 사용하지 않는다. + +### JSP 특징 + +- Presentation Logic과 Business Logic 분리 + - 웹 페이지의 디자인이 변경되더라도 내부 비즈니스 로직을 처리하는 JSP와 `Javabeans` 코드는 변경 될 필요가 없다. 반대도 마찬가지 +- 컴포넌트의 재사용 가능 + - 공통적으로 사용되는 컴포넌트를 만들어서 재사용할 수 있다. + - ex) 주소 검색, 한글 처리, 데이터베이스 연결 등 +- JSTL, EL, 커스텀 태그 들을 활용해서 개발을 용이하게 할 수 있다. + +프레젠테이션 로직을 서버에서 분리하고, 다양한 클라이언트 플랫폼을 지원하기 위해 MVVM 모델을 사용하면서 JSP도 이제는 많이 사용하지 않는다! + +### JSP 처리 과정 + +![image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fe8cbf7c2-3b8a-489b-814c-20c6e9b22b68%2FUntitled.png?table=block&id=afa0bbfb-73ec-478d-887d-bb7e7381a56c&spaceId=11280ec7-1c04-494f-8388-43ed5ddfcb0a&width=1230&userId=e567590d-ab63-42a6-869b-009383fc3d4f&cache=v2) + +JSP는 최초 요청 시 Servlet 파일로 변환되고 다시 클래스 파일로 컴파일된다. + +서블릿 컨테이너인 톰캣이 클래스 파일을 실행시켜 결과를 웹 브라우저로 전달한다. + +하지만 요청할 때 마다 매번 JSP 파일을 서블릿으로 변환하는건 비효율적이니까 맨 처음 요청에만 변환 과정이 존재한다. + +한 번이라도 요청했던 JSP 파일을 다시 요청하면 이미 메모리에 적재된 클래스가 응답을 주기 때문에 대체로 평균 응답시간이 짧다. + +
+ +## 정리 + +> WAS인 **Tomcat**은 서블릿 컨테이너로 동작하여 자바 서블릿을 실행하고, JSP 페이지를 렌더링해서 제공함으로써 동적인 웹 콘텐츠를 다룰 수 있다. +> +> **Servlet**은 Java를 이용해서 동적인 웹 콘텐츠를 만들 수 있는 프로그램이다. Java 코드 안에 HTML 코드를 삽입할 수 있다. 하지만 Servlet으로 직접 View 페이지를 생성하는 건 가독성이 떨어진다. +> +> **JSP**는 HTML 문서 안에 Java 코드를 삽입해서 웹 페이지를 동적으로 만들 수 있게 해준다. 요청 시 Servlet으로 변환된다. \ No newline at end of file