From 0a9ad54580c5a11d5864286b7f41a3d3e4adabbe Mon Sep 17 00:00:00 2001 From: Jimin Kim Date: Sun, 11 Feb 2024 14:04:51 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20content=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/10 Wiki/11 Java/11.2 OOP.md | 182 +++++++++--------- .../11 Java/11.3 \354\213\254\355\231\224.md" | 116 +++++------ ...20\353\243\214\352\265\254\354\241\260.md" | 71 ++++--- ...14\352\263\240\353\246\254\354\246\230.md" | 31 ++- ...60\354\212\244\353\246\204\353\217\210.md" | 8 +- ...0\353\212\224 \355\212\270\353\237\255.md" | 2 +- .../13.01 \352\270\260\354\264\210.md" | 60 +++--- content/10 Wiki/13 Spring/13.02 DI.md | 26 +-- content/10 Wiki/13 Spring/13.03 AOP.md | 36 ++-- content/10 Wiki/13 Spring/13.04 MVC.md | 60 +++--- content/10 Wiki/13 Spring/13.06 Data JPA.md | 58 +++--- .../10 Wiki/13 Spring/13.07 Transactions.md | 14 +- content/10 Wiki/13 Spring/13.08 Testing.md | 81 ++++---- content/10 Wiki/13 Spring/13.09 Security.md | 8 +- content/10 Wiki/19 Misc/Computer Networks.md | 2 +- content/10 Wiki/19 Misc/Design Patterns.md | 30 +-- content/10 Wiki/19 Misc/Git.md | 4 +- content/10 Wiki/19 Misc/HTML & CSS.md | 6 +- content/10 Wiki/19 Misc/RDBs.md | 101 ++++++++-- content/10 Wiki/19 Misc/Security.md | 50 ++--- 20 files changed, 522 insertions(+), 424 deletions(-) diff --git a/content/10 Wiki/11 Java/11.2 OOP.md b/content/10 Wiki/11 Java/11.2 OOP.md index f878856..6ac58ad 100644 --- a/content/10 Wiki/11 Java/11.2 OOP.md +++ b/content/10 Wiki/11 Java/11.2 OOP.md @@ -30,10 +30,10 @@ public class ExampleClass { ExampleClass exampleInstance = new ExampleClass(); ``` -> **References** -> -> - [Object-oriented programming - Wikipedia](https://en.wikipedia.org/wiki/Object-oriented_programming) -> - [What is the difference between an Instance and an Object?](https://stackoverflow.com/questions/2885385/what-is-the-difference-between-an-instance-and-an-object) +### *References* + +- [Object-oriented programming - Wikipedia](https://en.wikipedia.org/wiki/Object-oriented_programming) +- [What is the difference between an Instance and an Object?](https://stackoverflow.com/questions/2885385/what-is-the-difference-between-an-instance-and-an-object) ## 필드와 메서드 @@ -46,11 +46,11 @@ ExampleClass exampleInstance = new ExampleClass(); 필드의 경우 따로 초기화를 하지 않아도 정해져 있는 기본값으로 초기화가 된다. 반면에, 지역 변수의 경우 초기화를 하지 않고 사용하는 경우 compile-time error가 발생한다. -> **References** -> -> - [Variables](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html) -> - [Declaring Member Variables](https://docs.oracle.com/javase/tutorial/java/javaOO/variables.html) -> - [8.3. Field Declarations](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.3) +#### *References* + +- [Variables](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html) +- [Declaring Member Variables](https://docs.oracle.com/javase/tutorial/java/javaOO/variables.html) +- [8.3. Field Declarations](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.3) ### 메서드 (Method) @@ -61,10 +61,10 @@ ExampleClass exampleInstance = new ExampleClass(); 메서드의 이름이 같더라도 매개변수의 개수, 타입의 차이에 따라 메서드 시그니처 (method signature)가 다른 것으로 인식하여 따로 선언이 가능하다. 같은 메서드 이름으로 여러 경우의 수를 해결할 수 있는 장점이 있다. -> **References** -> -> - [Defining Methods](https://docs.oracle.com/javase/tutorial/java/javaOO/methods.html) -> - [8.4. Method Declarations](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.4) +#### *References* + +- [Defining Methods](https://docs.oracle.com/javase/tutorial/java/javaOO/methods.html) +- [8.4. Method Declarations](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.4) ### `static` 키워드 @@ -72,10 +72,10 @@ ExampleClass exampleInstance = new ExampleClass(); 인스턴스가 생성되지 않은 상태에서 사용 가능해야 하기 때문에 클래스 메서드에서는 인스턴스 변수와 메서드를 별도의 객체 참조없이 접근할 수 없고 `this` 키워드도 사용할 수 없다. `static` 키워드를 내부 클래스에도 사용할 수 있는데 이 경우 해당 내부 클래스는 클래스 메서드와 비슷하게 인스턴스 변수와 메서드에 접근할 수 없게 되어 외부에 있는 클래스처럼 동작한다. -> **References** -> -> - [Understanding Class Members](https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html) -> - [Nested Classes](https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html) +#### *References* + +- [Understanding Class Members](https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html) +- [Nested Classes](https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html) ## 생성자 (Constructor) @@ -100,10 +100,10 @@ class Example { } ``` -> **References** -> -> - [Providing Constructors for Your Classes](https://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html) -> - [8.8. Constructor Declarations](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.8) +#### *References* + +- [Providing Constructors for Your Classes](https://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html) +- [8.8. Constructor Declarations](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.8) ### `this`, `this()` @@ -125,10 +125,10 @@ class Example { } ``` -> **References** -> -> - [Using the this Keyword](https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html) -> - [15.8.3. `this`](https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.8.3) +#### *References* + +- [Using the this Keyword](https://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html) +- [15.8.3. `this`](https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.8.3) ## Nested class @@ -160,11 +160,11 @@ class Outer { - 서로 연관된 작은 클래스를 이너 클래스로 가지고 있으면 코드의 위치가 가까워 코드의 가독성, 유지보수성 측면에서서도 도움이 된다. - 캡슐화에 도움이 된다. 이너 클래스 자신을 멤버로 가지는 클래스의 `private` 멤버에 접근할 수 있으면서 그 외부의 클래스에서는 이너 클래스에 접근할 수 없게 할 수 있다. -> **References** -> -> - [Nested Classes](https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html) -> - [8.1.3. Inner Classes and Enclosing Instances](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.1.3) -> - [Java Inner Class | DigitalOcean](https://www.digitalocean.com/community/tutorials/java-inner-class) +#### *References* + +- [Nested Classes](https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html) +- [8.1.3. Inner Classes and Enclosing Instances](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.1.3) +- [Java Inner Class | DigitalOcean](https://www.digitalocean.com/community/tutorials/java-inner-class) ## [상속 (Inheritance)](https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)) @@ -199,9 +199,9 @@ class Engine { } ``` -> **Further Reading** -> -> - [What is the difference between association, aggregation and composition?](https://stackoverflow.com/questions/885937/what-is-the-difference-between-association-aggregation-and-composition) +#### *Further Reading* + +- [What is the difference between association, aggregation and composition?](https://stackoverflow.com/questions/885937/what-is-the-difference-between-association-aggregation-and-composition) ### 메서드 오버라이딩 (Overriding) @@ -235,13 +235,13 @@ class Developer extends Person{ | 메서드의 시그니처가 같음 | 메서드의 시그니처가 다름 | | 런타임 다형성을 구현, 어떤 메서드를 호출할 지 런타임에 결정됨 | 컴파일타임 다형성을 구현, 어떤 메서드를 호출할 지 컴파일타임에 결정됨 | -> **References** -> -> - [8.4.5. Method Result](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.4.5) -> - [8.4.8. Inheritance, Overriding, and Hiding](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.4.8) -> - [Can overridden methods differ in return type?](https://stackoverflow.com/questions/14694852/can-overridden-methods-differ-in-return-type) -> - [Overriding vs Overloading in Java | DigitalOcean](https://www.digitalocean.com/community/tutorials/overriding-vs-overloading-in-java) -> - [메서드 오버로딩 (Overloading)](#메서드-오버로딩-overloading) +#### *References* + +- [8.4.5. Method Result](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.4.5) +- [8.4.8. Inheritance, Overriding, and Hiding](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.4.8) +- [Can overridden methods differ in return type?](https://stackoverflow.com/questions/14694852/can-overridden-methods-differ-in-return-type) +- [Overriding vs Overloading in Java | DigitalOcean](https://www.digitalocean.com/community/tutorials/overriding-vs-overloading-in-java) +- [메서드 오버로딩 (Overloading)](#메서드-오버로딩-overloading) ### `super`, `super()` @@ -267,11 +267,11 @@ class Developer extends Person{ } ``` -> **References** -> -> - [8.8.7. Constructor Body](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.8.7) -> - [8.8.9. Default Constructor](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.8.9) -> - [15.11.2. Accessing Superclass Members using `super`](https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.11.2) +#### *References* + +- [8.8.7. Constructor Body](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.8.7) +- [8.8.9. Default Constructor](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.8.9) +- [15.11.2. Accessing Superclass Members using `super`](https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.11.2) ### `Object` 클래스 @@ -279,14 +279,14 @@ class Developer extends Person{ 컴파일러는 아무 상속이 없는 모든 클래스에 `extends Object`를 추가하여 `Object` 클래스를 상속받게 한다. 그렇기 때문에 모든 클래스는 `Object` 클래스가 가진 멤버 메서드를 상속받아 사용 가능하다. -> **References** -> -> - [Object (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html) -> - [4.3.2. The Class `Object`](https://docs.oracle.com/javase/specs/jls/se11/html/jls-4.html#jls-4.3.2) -> -> **Further Reading** -> -> - [Inheritance](https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html) +#### *References* + +- [Object (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html) +- [4.3.2. The Class `Object`](https://docs.oracle.com/javase/specs/jls/se11/html/jls-4.html#jls-4.3.2) + +#### *Further Reading* + +- [Inheritance](https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html) ## [캡슐화 (Encapsulation)](https://en.wikipedia.org/wiki/Encapsulation_(computer_programming)) @@ -323,10 +323,10 @@ public class ImportingExample { } ``` -> **References** -> -> - [Lesson: Packages](https://docs.oracle.com/javase/tutorial/java/package/index.html) -> - [Chapter 7. Packages and Modules](https://docs.oracle.com/javase/specs/jls/se11/html/jls-7.html) +#### *References* + +- [Lesson: Packages](https://docs.oracle.com/javase/tutorial/java/package/index.html) +- [Chapter 7. Packages and Modules](https://docs.oracle.com/javase/specs/jls/se11/html/jls-7.html) ### 접근 제어자 (Access modifiers) @@ -350,10 +350,10 @@ public class Example [ } ``` -> **References** -> -> - [6.6. Access Control](https://docs.oracle.com/javase/specs/jls/se11/html/jls-6.html#jls-6.6) -> - [Controlling Access to Members of a Class](https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html) +#### *References* + +- [6.6. Access Control](https://docs.oracle.com/javase/specs/jls/se11/html/jls-6.html#jls-6.6) +- [Controlling Access to Members of a Class](https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html) ### [getter, setter 메서드](https://en.wikipedia.org/wiki/Mutator_method) @@ -369,16 +369,16 @@ class Example { } public void setPositiveNum(int num) { - if (num > 0) positiveNum = num; + if (num 0) positiveNum = num; } } ``` -> **Further Reading** -> -> - [Why use getters and setters/accessors?](https://stackoverflow.com/questions/1568091/why-use-getters-and-setters-accessors) -> - [Are getters and setters poor design? Contradictory advice seen](https://stackoverflow.com/questions/565095/are-getters-and-setters-poor-design-contradictory-advice-seen) -> - [JavaBeans - Wikipedia](https://en.wikipedia.org/wiki/JavaBeans) +#### *Further Reading* + +- [Why use getters and setters/accessors?](https://stackoverflow.com/questions/1568091/why-use-getters-and-setters-accessors) +- [Are getters and setters poor design? Contradictory advice seen](https://stackoverflow.com/questions/565095/are-getters-and-setters-poor-design-contradictory-advice-seen) +- [JavaBeans - Wikipedia](https://en.wikipedia.org/wiki/JavaBeans) ## [다형성 (Polymorphism)](https://en.wikipedia.org/wiki/Polymorphism_(computer_science)) @@ -415,11 +415,11 @@ class Developer extends Person { } ``` -> **References** -> -> - [15.16. Cast Expressions](https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.16) -> - [5.5. Casting Contexts](https://docs.oracle.com/javase/specs/jls/se11/html/jls-5.html#jls-5.5) -> - [5.1.6. Narrowing Reference Conversion](https://docs.oracle.com/javase/specs/jls/se11/html/jls-5.html#jls-5.1.6) +#### *References* + +- [15.16. Cast Expressions](https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.16) +- [5.5. Casting Contexts](https://docs.oracle.com/javase/specs/jls/se11/html/jls-5.html#jls-5.5) +- [5.1.6. Narrowing Reference Conversion](https://docs.oracle.com/javase/specs/jls/se11/html/jls-5.html#jls-5.1.6) ### `instanceof` 연산자 @@ -456,10 +456,10 @@ class Student extends Person { } ``` -> **References** -> -> - [Equality, Relational, and Conditional Operators](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html) -> - [15.20.2. Type Comparison Operator `instanceof`](https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.20.2) +#### *References* + +- [Equality, Relational, and Conditional Operators](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html) +- [15.20.2. Type Comparison Operator `instanceof`](https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.20.2) ## [추상화 (Abstraction)](https://en.wikipedia.org/wiki/Abstraction_(computer_science)) @@ -478,11 +478,11 @@ abstract class Example { } ``` -> **References** -> -> - [Abstract Methods and Classes](https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html) -> - [8.1.1.1. `abstract` Classes](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.1.1.1) -> - [8.4.3.1. `abstract` Methods](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.4.3.1) +#### *References* + +- [Abstract Methods and Classes](https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html) +- [8.1.1.1. `abstract` Classes](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.1.1.1) +- [8.4.3.1. `abstract` Methods](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.4.3.1) ### `final` 키워드 @@ -503,12 +503,12 @@ final class Example { } ``` -> **References** -> -> - [4.12.4. `final` Variables](https://docs.oracle.com/javase/specs/jls/se11/html/jls-4.html#jls-4.12.4) -> - [8.1.1.2. `final` Classes](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.1.1.2) -> - [8.3.1.2. `final` Fields](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.3.1.2) -> - [8.4.3.3. `final` Methods](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.4.3.3) +#### *References* + +- [4.12.4. `final` Variables](https://docs.oracle.com/javase/specs/jls/se11/html/jls-4.html#jls-4.12.4) +- [8.1.1.2. `final` Classes](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.1.1.2) +- [8.3.1.2. `final` Fields](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.3.1.2) +- [8.4.3.3. `final` Methods](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.4.3.3) ### 인터페이스 (Interfaces) @@ -545,7 +545,7 @@ class ExampleClass implements Interface1, Interface2 { // 다중 구현 가능 } ``` -> **References** -> -> - [Interfaces](https://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html) -> - [Chapter 9. Interfaces](https://docs.oracle.com/javase/specs/jls/se11/html/jls-9.html) +#### *References* + +- [Interfaces](https://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html) +- [Chapter 9. Interfaces](https://docs.oracle.com/javase/specs/jls/se11/html/jls-9.html) diff --git "a/content/10 Wiki/11 Java/11.3 \354\213\254\355\231\224.md" "b/content/10 Wiki/11 Java/11.3 \354\213\254\355\231\224.md" index be7a488..9019220 100644 --- "a/content/10 Wiki/11 Java/11.3 \354\213\254\355\231\224.md" +++ "b/content/10 Wiki/11 Java/11.3 \354\213\254\355\231\224.md" @@ -17,11 +17,11 @@ public enum Day { } ``` -> **References** -> -> - [Enum Types](https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html) -> - [8.9. Enum Types](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.9) -> - [Enum (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Enum.html) +### *References* + +- [Enum Types](https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html) +- [8.9. Enum Types](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.9) +- [Enum (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Enum.html) ## [제네릭 (Generics)](https://en.wikipedia.org/wiki/Generic_programming) @@ -57,13 +57,13 @@ public class Pair { // 제네릭 클래스 (제네릭 타입: 제네릭 - `Object` 클래스를 사용하는 것 보다 컴파일 타임 타입 체크를 확실하게 할 수 있고 타입 캐스팅을 줄일 수 있다. - 여러 다른 타입에 사용할 수 있고 커스터마이징 가능, 타입 체크 가능한 제네릭 알고리즘을 만들 수 있어서 코드의 중복을 막는데 도움이 된다. -> **References** -> -> - [Lesson: Generics (Updated)](https://docs.oracle.com/javase/tutorial/java/generics/index.html) -> - [Chapter 4. Types, Values, and Variables](https://docs.oracle.com/javase/specs/jls/se11/html/jls-4.html#jls-4.4) -> From *4.4. Type Variables* to *4.9. Intersection Types* -> - [Chapter 18. Type Inference](https://docs.oracle.com/javase/specs/jls/se11/html/jls-18.html) -> - [Why Use Generics?](https://docs.oracle.com/javase/tutorial/java/generics/why.html) +#### *References* + +- [Lesson: Generics (Updated)](https://docs.oracle.com/javase/tutorial/java/generics/index.html) +- [Chapter 4. Types, Values, and Variables](https://docs.oracle.com/javase/specs/jls/se11/html/jls-4.html#jls-4.4) + From *4.4. Type Variables* to *4.9. Intersection Types* +- [Chapter 18. Type Inference](https://docs.oracle.com/javase/specs/jls/se11/html/jls-18.html) +- [Why Use Generics?](https://docs.oracle.com/javase/tutorial/java/generics/why.html) ## [예외 처리 (Exception handling)](https://en.wikipedia.org/wiki/Exception_handling) @@ -121,17 +121,17 @@ public Object pop() { } ``` -> **References** -> -> - [Lesson: Exceptions](https://docs.oracle.com/javase/tutorial/essential/exceptions/index.html) -> - [Chapter 11. Exceptions](https://docs.oracle.com/javase/specs/jls/se11/html/jls-11.html) -> - [14.20. The `try` statement](https://docs.oracle.com/javase/specs/jls/se11/html/jls-14.html#jls-14.20) -> - [8.4.6. Method Throws](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.4.6) -> - [14.18. The `throw` Statement](https://docs.oracle.com/javase/specs/jls/se11/html/jls-14.html#jls-14.18) -> -> **Further Reading** -> -> - [Error (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Error.html) +### *References* + +- [Lesson: Exceptions](https://docs.oracle.com/javase/tutorial/essential/exceptions/index.html) +- [Chapter 11. Exceptions](https://docs.oracle.com/javase/specs/jls/se11/html/jls-11.html) +- [14.20. The `try` statement](https://docs.oracle.com/javase/specs/jls/se11/html/jls-14.html#jls-14.20) +- [8.4.6. Method Throws](https://docs.oracle.com/javase/specs/jls/se11/html/jls-8.html#jls-8.4.6) +- [14.18. The `throw` Statement](https://docs.oracle.com/javase/specs/jls/se11/html/jls-14.html#jls-14.18) + +### *Further Reading* + +- [Error (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Error.html) ## 컬렉션 프레임워크 (Collections framework) @@ -175,11 +175,11 @@ public Object pop() { 컬렉션의 요소를 하나씩 순회할 때 사용하는 객체이다. 컬렉션에 따라 [`iterator()`](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Collection.html#iterator()) 메서드를 사용하여 이터레이터를 만들 수 있다. -> **References** -> -> - [The Collection Interface](https://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html) -> *Iterators* -> - [Iterator (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Iterator.html) +#### *References* + +- [The Collection Interface](https://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html) + *Iterators* +- [Iterator (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Iterator.html) ### [`Map`](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Map.html) @@ -192,18 +192,18 @@ Key와 entry는 중복이 허용되지 않고 value는 중복될 수 있다. 이터레이터를 활용할 때 `Map` 자체로는 이터레이터를 사용할 수 없고 `entrySet()`, `keySet()`, `values()` 등 각 entry, key, value 들을 따로 `Set`, `Collection`으로 반환해주는 메소드를 활용한 후 이터레이터를 사용해야 한다. -> **References** -> -> - [Trail: Collections](https://docs.oracle.com/javase/tutorial/collections/index.html) -> - [The Collections Framework](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/doc-files/coll-index.html) -> -> **Further Reading** -> -> - [Why is Java Vector (and Stack) class considered obsolete or deprecated?](https://stackoverflow.com/questions/1386275/why-is-java-vector-and-stack-class-considered-obsolete-or-deprecated) -> - [Varargs](https://docs.oracle.com/javase/8/docs/technotes/guides/language/varargs.html) -> - [Can I pass an array as arguments to a method with variable arguments in Java?](https://stackoverflow.com/questions/2925153/can-i-pass-an-array-as-arguments-to-a-method-with-variable-arguments-in-java) -> - [Autoboxing](https://docs.oracle.com/javase/8/docs/technotes/guides/language/autoboxing.html) -> - [Autoboxing and Unboxing](https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html) +#### *References* + +- [Trail: Collections](https://docs.oracle.com/javase/tutorial/collections/index.html) +- [The Collections Framework](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/doc-files/coll-index.html) + +#### **Further Reading** + +- [Why is Java Vector (and Stack) class considered obsolete or deprecated?](https://stackoverflow.com/questions/1386275/why-is-java-vector-and-stack-class-considered-obsolete-or-deprecated) +- [Varargs](https://docs.oracle.com/javase/8/docs/technotes/guides/language/varargs.html) +- [Can I pass an array as arguments to a method with variable arguments in Java?](https://stackoverflow.com/questions/2925153/can-i-pass-an-array-as-arguments-to-a-method-with-variable-arguments-in-java) +- [Autoboxing](https://docs.oracle.com/javase/8/docs/technotes/guides/language/autoboxing.html) +- [Autoboxing and Unboxing](https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html) ## 애너테이션 (Annotations) @@ -225,12 +225,12 @@ Key와 entry는 중복이 허용되지 않고 value는 중복될 수 있다. - [java.util.stream (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/stream/package-summary.html) - [Optional (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Optional.html) -> **Further Reading** -> -> - [Imperative programming - Wikipedia](https://en.wikipedia.org/wiki/Imperative_programming) -> - [Procedural programming - Wikipedia](https://en.wikipedia.org/wiki/Procedural_programming) -> - [Declarative programming - Wikipedia](https://en.wikipedia.org/wiki/Declarative_programming) -> - [Functional programming - Wikipedia](https://en.wikipedia.org/wiki/Functional_programming) +### *Further Reading* + +- [Imperative programming - Wikipedia](https://en.wikipedia.org/wiki/Imperative_programming) +- [Procedural programming - Wikipedia](https://en.wikipedia.org/wiki/Procedural_programming) +- [Declarative programming - Wikipedia](https://en.wikipedia.org/wiki/Declarative_programming) +- [Functional programming - Wikipedia](https://en.wikipedia.org/wiki/Functional_programming) ## 파일 입출력 (I/O) @@ -275,15 +275,15 @@ Key와 entry는 중복이 허용되지 않고 value는 중복될 수 있다. C 언어 등 자바가 아닌 언어를 포함한 `native` 메서드를 호출할 때 사용한다. -> **References** -> -> - [Java (JVM) Memory Model - Memory Management in Java | DigitalOcean](https://www.digitalocean.com/community/tutorials/java-jvm-memory-model-memory-management-in-java) -> - [Chapter 2. The Structure of the Java Virtual Machine](https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-2.html) -> - [4.4. The Constant Pool](https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-4.html#jvms-4.4) -> - [Understanding the constant pool inside a Java class file](https://blogs.oracle.com/javamagazine/post/java-class-file-constant-pool) -> -> **Further Reading** -> -> - [Understanding Garbage Collectors](https://blogs.oracle.com/javamagazine/post/understanding-garbage-collectors) -> - [Java Virtual Machine Guide](https://docs.oracle.com/en/java/javase/11/vm/java-virtual-machine-technology-overview.html#GUID-982B244A-9B01-479A-8651-CB6475019281) -> - [3 Garbage Collector Implementation](https://docs.oracle.com/en/java/javase/11/gctuning/garbage-collector-implementation.html#GUID-23844E39-7499-400C-A579-032B68E53073) +#### *References* + +- [Java (JVM) Memory Model - Memory Management in Java | DigitalOcean](https://www.digitalocean.com/community/tutorials/java-jvm-memory-model-memory-management-in-java) +- [Chapter 2. The Structure of the Java Virtual Machine](https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-2.html) +- [4.4. The Constant Pool](https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-4.html#jvms-4.4) +- [Understanding the constant pool inside a Java class file](https://blogs.oracle.com/javamagazine/post/java-class-file-constant-pool) + +#### *Further Reading* + +- [Understanding Garbage Collectors](https://blogs.oracle.com/javamagazine/post/understanding-garbage-collectors) +- [Java Virtual Machine Guide](https://docs.oracle.com/en/java/javase/11/vm/java-virtual-machine-technology-overview.html#GUID-982B244A-9B01-479A-8651-CB6475019281) +- [3 Garbage Collector Implementation](https://docs.oracle.com/en/java/javase/11/gctuning/garbage-collector-implementation.html#GUID-23844E39-7499-400C-A579-032B68E53073) diff --git "a/content/10 Wiki/12 DSA/12.1 \354\235\264\353\241\240/12.11 \354\236\220\353\243\214\352\265\254\354\241\260.md" "b/content/10 Wiki/12 DSA/12.1 \354\235\264\353\241\240/12.11 \354\236\220\353\243\214\352\265\254\354\241\260.md" index 71c5be1..22888f2 100644 --- "a/content/10 Wiki/12 DSA/12.1 \354\235\264\353\241\240/12.11 \354\236\220\353\243\214\352\265\254\354\241\260.md" +++ "b/content/10 Wiki/12 DSA/12.1 \354\235\264\353\241\240/12.11 \354\236\220\353\243\214\352\265\254\354\241\260.md" @@ -18,68 +18,75 @@ tags: --- # 자료구조 -## Stack +## [Stack] 1. 후입선출 (LIFO) 자료구조 2. 데이터를 하나씩 입출력 3. 한쪽 끝에서만 입출력이 발생 -> **References** -> -> - [Stack](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)) -> - [Stack (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Stack.html) +[Stack]: https://en.wikipedia.org/wiki/Stack_(abstract_data_type) -## Queue +### *References* + +- [Stack (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Stack.html) + +## [Queue] 1. 선입선출 (FIFO) 자료구조 2. 데이터를 하나씩 입출력 3. 데이터의 입력부와 출력부가 나뉘어져 있음 -> **References** -> -> - [Queue](https://en.wikipedia.org/wiki/Queue_(abstract_data_type)) -> - [Queue (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Queue.html) -> - [ArrayDeque (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ArrayDeque.html) -> - [LinkedList (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/LinkedList.html) +[Queue]: https://en.wikipedia.org/wiki/Queue_(abstract_data_type) + +### *References* + +- [Queue (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Queue.html) +- [ArrayDeque (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ArrayDeque.html) +- [LinkedList (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/LinkedList.html) + +## [Linked List] -## Linked List +[Linked list]: https://en.wikipedia.org/wiki/Linked_list -- [Linked list](https://en.wikipedia.org/wiki/Linked_list) - [LinkedList (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/LinkedList.html) -## Deque +## [Deque (Double-ended queue)] + +[Deque (Double-ended queue)]: https://en.wikipedia.org/wiki/Double-ended_queue -- [Deque (Double-ended queue)](https://en.wikipedia.org/wiki/Double-ended_queue) - [Deque (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Deque.html) - [ArrayDeque (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/ArrayDeque.html) -## Hash Table +## [Hash Table] + +[Hash table]: https://en.wikipedia.org/wiki/Hash_table -- [Hash table](https://en.wikipedia.org/wiki/Hash_table) - [HashMap (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/HashMap.html) - [Hashtable (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Hashtable.html) -## Tree +## [Tree] + +[Tree]: https://en.wikipedia.org/wiki/Tree_(data_structure) -- [Tree](https://en.wikipedia.org/wiki/Tree_(data_structure)) - [Binary tree](https://en.wikipedia.org/wiki/Binary_tree) - - [Tree traversal](https://en.wikipedia.org/wiki/Tree_traversal) - - Preorder - - Inorder - - Postorder + - [Tree traversal](https://en.wikipedia.org/wiki/Tree_traversal) + - Preorder + - Inorder + - Postorder - [Binary search tree](https://en.wikipedia.org/wiki/Binary_search_tree) - [Heap](https://en.wikipedia.org/wiki/Heap_(data_structure)) - - [PriorityQueue (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/PriorityQueue.html) + - [PriorityQueue (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/PriorityQueue.html) - [Trie](https://en.wikipedia.org/wiki/Trie) - [AST](https://en.wikipedia.org/wiki/Abstract_syntax_tree) -## Graph +## [Graph] + +[Graph]: https://en.wikipedia.org/wiki/Graph_(abstract_data_type) -- [Graph](https://en.wikipedia.org/wiki/Graph_(abstract_data_type)) - [Graph search](https://en.wikipedia.org/wiki/Graph_traversal) - - [Depth-first search (DFS)](https://en.wikipedia.org/wiki/Depth-first_search) - - [Breadth-first search (BFS)](https://en.wikipedia.org/wiki/Breadth-first_search) + - [Depth-first search (DFS)](https://en.wikipedia.org/wiki/Depth-first_search) + - [Breadth-first search (BFS)](https://en.wikipedia.org/wiki/Breadth-first_search) + +### *References* -> **References** -> -> - [Difference between BFS and DFS - GeeksforGeeks](https://www.geeksforgeeks.org/difference-between-bfs-and-dfs/) +- [Difference between BFS and DFS - GeeksforGeeks](https://www.geeksforgeeks.org/difference-between-bfs-and-dfs/) diff --git "a/content/10 Wiki/12 DSA/12.1 \354\235\264\353\241\240/12.12 \354\225\214\352\263\240\353\246\254\354\246\230.md" "b/content/10 Wiki/12 DSA/12.1 \354\235\264\353\241\240/12.12 \354\225\214\352\263\240\353\246\254\354\246\230.md" index 12abba2..6915f32 100644 --- "a/content/10 Wiki/12 DSA/12.1 \354\235\264\353\241\240/12.12 \354\225\214\352\263\240\353\246\254\354\246\230.md" +++ "b/content/10 Wiki/12 DSA/12.1 \354\235\264\353\241\240/12.12 \354\225\214\352\263\240\353\246\254\354\246\230.md" @@ -14,9 +14,11 @@ tags: ## 복잡도 - [복잡도](https://en.wikipedia.org/wiki/Computational_complexity) - - [시간 복잡도](https://en.wikipedia.org/wiki/Time_complexity) + - [시간 복잡도](https://en.wikipedia.org/wiki/Time_complexity) -## 재귀 (Recursion) +## [재귀 (Recursion)] + +[재귀 (Recursion)]: https://en.wikipedia.org/wiki/Recursion_(computer_science) ### 재귀 함수의 장점 @@ -29,10 +31,6 @@ tags: - 메서드를 반복적으로 호출하면서 메모리의 스택 영역을 많이 점유하게 되어 반복문에 비해 더 많은 메모리를 사용하게 된다. - 메서드가 호출되고 종료하면서 컨텍스트 스위칭이 이루어지는 비용을 감수해야 한다. -> **References** -> -> - [재귀 (Recursion)](https://en.wikipedia.org/wiki/Recursion_(computer_science)) - ## Greedy Algorithm - [Greedy algorithm](https://en.wikipedia.org/wiki/Greedy_algorithm) @@ -53,27 +51,26 @@ tags: - [Binary search algorithm](https://en.wikipedia.org/wiki/Binary_search_algorithm) -## Parametric Search +## [Parametric Search] 결정 알고리즘을 최적화 알고리즘으로 바꾸는 테크닉 최적화 문제를 결정 문제로 바꿔서 풀 수 있다. 이분 탐색을 사용하여 결정 문제를 만족시키는 값을 찾고 그 값이 최적화 문제의 답이 되는 유형이 존재한다. -> **References** -> -> - [Parametric search](https://en.wikipedia.org/wiki/Parametric_search) +[Parametric search]: https://en.wikipedia.org/wiki/Parametric_search -## Math +## Math Algorithms -### 순열 +### [순열 (Permutation)] 순열을 만드는 과정을 그래프로 생각하고 DFS, BFS를 활용할 수 있다. -> **References** -> -> - [순열 (Permutation)](https://en.wikipedia.org/wiki/Permutation) -> - [Permutation Algorithms Using Iteration and the Base-N-Odometer Model (Without Recursion)](https://www.quickperm.org/quickperm.html) -> - [itertools - Functions creating iterators for efficient looping - Python 3.10.7 documentation](https://docs.python.org/3/library/itertools.html) +[순열 (Permutation)]: https://en.wikipedia.org/wiki/Permutation + +#### *References* + +- [Permutation Algorithms Using Iteration and the Base-N-Odometer Model (Without Recursion)](https://www.quickperm.org/quickperm.html) +- [itertools - Functions creating iterators for efficient looping - Python 3.10.7 documentation](https://docs.python.org/3/library/itertools.html) ### 최대공약수 (Great Common Divisor) diff --git "a/content/10 Wiki/12 DSA/12.2 \353\254\270\354\240\234/\352\261\260\354\212\244\353\246\204\353\217\210.md" "b/content/10 Wiki/12 DSA/12.2 \353\254\270\354\240\234/\352\261\260\354\212\244\353\246\204\353\217\210.md" index 7392993..0e7c60e 100644 --- "a/content/10 Wiki/12 DSA/12.2 \353\254\270\354\240\234/\352\261\260\354\212\244\353\246\204\353\217\210.md" +++ "b/content/10 Wiki/12 DSA/12.2 \353\254\270\354\240\234/\352\261\260\354\212\244\353\246\204\353\217\210.md" @@ -23,7 +23,7 @@ class Solution { } ``` -> **References** -> -> - [거스름돈](https://school.programmers.co.kr/learn/courses/30/lessons/12907) -> - [Coin Change | DP-7 - GeeksforGeeks](https://www.geeksforgeeks.org/coin-change-dp-7/?ref=rp) +## *References* + +- [거스름돈](https://school.programmers.co.kr/learn/courses/30/lessons/12907) +- [Coin Change | DP-7 - GeeksforGeeks](https://www.geeksforgeeks.org/coin-change-dp-7/?ref=rp) diff --git "a/content/10 Wiki/12 DSA/12.2 \353\254\270\354\240\234/\353\213\244\353\246\254\353\245\274 \354\247\200\353\202\230\353\212\224 \355\212\270\353\237\255.md" "b/content/10 Wiki/12 DSA/12.2 \353\254\270\354\240\234/\353\213\244\353\246\254\353\245\274 \354\247\200\353\202\230\353\212\224 \355\212\270\353\237\255.md" index 858f8b4..0703e7b 100644 --- "a/content/10 Wiki/12 DSA/12.2 \353\254\270\354\240\234/\353\213\244\353\246\254\353\245\274 \354\247\200\353\202\230\353\212\224 \355\212\270\353\237\255.md" +++ "b/content/10 Wiki/12 DSA/12.2 \353\254\270\354\240\234/\353\213\244\353\246\254\353\245\274 \354\247\200\353\202\230\353\212\224 \355\212\270\353\237\255.md" @@ -4,7 +4,7 @@ tags: - Java - DSA --- -# Mac에서 Docker 사용하기 +# 다리를 지나는 트럭 ## 직관적으로 큐를 사용한 풀이 diff --git "a/content/10 Wiki/13 Spring/13.01 \352\270\260\354\264\210.md" "b/content/10 Wiki/13 Spring/13.01 \352\270\260\354\264\210.md" index d9b0c61..f8668e7 100644 --- "a/content/10 Wiki/13 Spring/13.01 \352\270\260\354\264\210.md" +++ "b/content/10 Wiki/13 Spring/13.01 \352\270\260\354\264\210.md" @@ -6,7 +6,9 @@ tags: --- # Spring Framework 기초 -## [Framework](https://en.wikipedia.org/wiki/Software_framework) +## [Framework] + +[Framework]: https://en.wikipedia.org/wiki/Software_framework 어떤 특수한 용도의 소프트웨어를 제작할 때 필요한 기본적인 기능들을 포함한 틀이 되는 추상화된 소프트웨어를 말한다. 단어 자체의 뜻처럼 소프트웨어의 뼈대, 골격이 된다. @@ -21,7 +23,9 @@ tags: - Framework마다 정해진 규약을 학습해야 함 - 자유도가 떨어짐 -### [Library](https://en.wikipedia.org/wiki/Library_(computing))와의 차이 +### [Library]와의 차이 + +[Library]: https://en.wikipedia.org/wiki/Library_(computing) 일반적인 라이브러리와 프레임워크는 차이점이 존재한다. 라이브러리는 개발자가 애플리케이션의 흐름에 맞추어 사용할 수 있고 프레임워크는 개발자가 프레임워크가 정한 애플리케이션의 흐름을 따라가게 된다. ([Inversion of Control, IoC](https://en.wikipedia.org/wiki/Inversion_of_control)) @@ -46,12 +50,12 @@ Java로 웹 애플리케이션을 개발하기 위한 프레임워크 중 하나 3. [Spring MVC](https://docs.spring.io/spring-framework/docs/current/reference/html/web.html) (프레임워크화) 4. [Spring Boot](https://docs.spring.io/spring-boot/docs/current/reference/html/) (설정 간소화) -> **Further Reading** -> -> - [Jakarta Servlet - Wikipedia](https://en.wikipedia.org/wiki/Jakarta_Servlet) -> - [Web container - Wikipedia](https://en.wikipedia.org/wiki/Web_container) -> - [Apache Tomcat - Wikipedia](https://en.wikipedia.org/wiki/Apache_Tomcat) -> - [Apache Tomcat®](https://tomcat.apache.org/) +#### *Further Reading* + +- [Jakarta Servlet - Wikipedia](https://en.wikipedia.org/wiki/Jakarta_Servlet) +- [Web container - Wikipedia](https://en.wikipedia.org/wiki/Web_container) +- [Apache Tomcat - Wikipedia](https://en.wikipedia.org/wiki/Apache_Tomcat) +- [Apache Tomcat®](https://tomcat.apache.org/) ### POJO (Plain Old Java Object) @@ -64,23 +68,23 @@ Java로 웹 애플리케이션을 개발하기 위한 프레임워크 중 하나 ### IoC (Inversion of Control) / DI (Dependency Injection) - IoC는 흐름을 제어하는 주도권이 역전된 형태를 의미한다. - - 자바 웹 애플리케이션의 경우 서블릿이 주도권을 가지고 있는 것이 아니라 서블릿 컨테이너가 주도권을 가지게 되어 IoC 개념이 적용된다. + - 자바 웹 애플리케이션의 경우 서블릿이 주도권을 가지고 있는 것이 아니라 서블릿 컨테이너가 주도권을 가지게 되어 IoC 개념이 적용된다. - DI는 IoC 개념을 객체 단계에서 구체화시킨 것으로 객체 간의 관계를 느슨하게 한다. - 클래스 내부에서 `new`를 사용하여 참조할 클래스의 객체를 직접 생성하는 경우 두 클래스 간에 의존관계가 성립하게 된다. - 클래스 내부에서 객체를 직접 생성하지 않고 생성자의 매개변수 등을 통해 외부에서 다른 클래스의 객체를 전달받는 경우를 의존성 주입이라고 한다. - `new`를 사용하여 해당 타입의 객체를 직접 생성할 때 클래스가 강하게 결합(tight coupling)되어있다고 한다. - 인터페이스와 같이 일반화된 구성 요소에 의존하는 경우 클래스가 느슨하게 결합(loose coupling)되어있다고 한다. - - 느슨한 결합을 사용하는 경우 요구 사항이 변경될 때 유연하게 대처할 수 있다. + - 느슨한 결합을 사용하는 경우 요구 사항이 변경될 때 유연하게 대처할 수 있다. - DI는 클래스 간의 강한 결합을 느슨한 결합으로 바꾼다. - Spring 프레임워크에서는 Config 클래스를 사용하여 DI를 프레임워크 단계에서 해준다. -> **Further Reading** -> -> - [SOLID - Wikipedia](https://en.wikipedia.org/wiki/SOLID) -> - Java Reflection API -> - [Trail: The Reflection API](https://docs.oracle.com/javase/tutorial/reflect/index.html) -> - [Using Java Reflection](https://www.oracle.com/technical-resources/articles/java/javareflection.html) -> - [java.lang.reflect (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/reflect/package-summary.html) +#### *Further Reading* + +- [SOLID - Wikipedia](https://en.wikipedia.org/wiki/SOLID) +- Java Reflection API + - [Trail: The Reflection API](https://docs.oracle.com/javase/tutorial/reflect/index.html) + - [Using Java Reflection](https://www.oracle.com/technical-resources/articles/java/javareflection.html) + - [java.lang.reflect (Java SE 11 & JDK 11 )](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/reflect/package-summary.html) ### AOP (Aspect-Oriented Programming) @@ -93,7 +97,9 @@ Java로 웹 애플리케이션을 개발하기 위한 프레임워크 중 하나 - OOP 원칙 준수 (단일 책임 원칙) - 코드의 재사용성 향상 -### [PSA (Portable Service Abstraction)](https://en.wikipedia.org/wiki/Service_abstraction) +### [PSA (Portable Service Abstraction)] + +[PSA (Portable Service Abstraction)]: https://en.wikipedia.org/wiki/Service_abstraction 애플리케이션에서 서비스를 이용할 때 기능에 접근하는 방식을 추상화하여 일관되게 유지하여 여러 서비스를 유연하게 변경하며 사용할 수 있게 한 것이 PSA이다. 애플리케이션에서 사용하는 서비스가 변경되더라도 최소한의 수정으로 변경된 요구 사항을 반영할 수 있게 한다. @@ -104,12 +110,16 @@ e.g. JDBC가 MySQL, Oracle, Postgres 등 여러 RDBMS 서비스를 변경하며 시스템, 소프트웨어, 하드웨어 등을 구성하는 구조와 방식을 아키텍처라고 부른다. -### [시스템 아키텍처 (Systems architecture)](https://en.wikipedia.org/wiki/Systems_architecture) +### [시스템 아키텍처 (Systems architecture)] + +[시스템 아키텍처 (Systems architecture)]: https://en.wikipedia.org/wiki/Systems_architecture 여러 소프트웨어와 하드웨어가 시스템을 이루는 경우의 아키텍처 e.g. 클라이언트 - 로드 밸런서 - 애플리케이션 서버 - 데이터 서버 -### [소프트웨어 아키텍처 (Software architecture)](https://en.wikipedia.org/wiki/Software_architecture) +### [소프트웨어 아키텍처 (Software architecture)] + +[소프트웨어 아키텍처 (Software architecture)]: https://en.wikipedia.org/wiki/Software_architecture 소프트웨어의 구성을 나타내는 아키텍처 @@ -135,10 +145,12 @@ Spring Framework의 구성은 Spring Boot에 맡기고 개발자는 비즈니스 - 프로덕션급 애플리케이션을 손쉽게 빌드할 수 있다. - 내장된 WAS를 사용하여 손쉽게 배포할 수 있다. -### [Spring Initializr](https://start.spring.io/) +### [Spring Initializr] + +[Spring Initializr]: https://start.spring.io/ 스프링 부트 프로젝트를 웹에서 쉽게 생성할 수 있다. -> **References** -> -> - [Spring Boot](https://spring.io/projects/spring-boot) +### *References* + +- [Spring Boot](https://spring.io/projects/spring-boot) diff --git a/content/10 Wiki/13 Spring/13.02 DI.md b/content/10 Wiki/13 Spring/13.02 DI.md index 1700143..0b1c19b 100644 --- a/content/10 Wiki/13 Spring/13.02 DI.md +++ b/content/10 Wiki/13 Spring/13.02 DI.md @@ -23,27 +23,27 @@ List userList = service.getUsernameList(); [`ApplicationContext`](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/ApplicationContext.html)가 컨테이너고 서비스 클래스를 Bean으로 정의하면 `getBean` 메서드로 인스턴스를 불러올 수 있게 된다. 실제 애플리케이션 코드 내에서는 IoC 원칙을 지키기 위해 Spring API의 일부인 `getBean` 사용을 지양해야 한다. 대신 autowiring을 활용한다. -> **References** -> -> - [Using the Container](https://docs.spring.io/spring-framework/reference/core/beans/basics.html#beans-factory-client) +### *References* + +- [Using the Container](https://docs.spring.io/spring-framework/reference/core/beans/basics.html#beans-factory-client) ## Beans 스프링 컨테이너가 관리하는 자바 객체를 Bean이라고 부른다. [`@Bean`](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Bean.html) 어노테이션을 메서드에 사용하면 해당 메서드가 반환하는 객체가 Bean으로 컨테이너에 등록된다. -> **Further Reading** -> -> - [JavaBeans - Wikipedia](https://en.wikipedia.org/wiki/JavaBeans) +### *Further Reading* + +- [JavaBeans - Wikipedia](https://en.wikipedia.org/wiki/JavaBeans) ## Bean scopes - [Bean Scopes](https://docs.spring.io/spring-framework/reference/core/beans/factory-scopes.html) - [The Singleton Scope](https://docs.spring.io/spring-framework/reference/core/beans/factory-scopes.html#beans-factory-scopes-singleton) -> **See Also** -> -> - [Singleton Pattern](../19%20Misc/Design%20Patterns.md#singleton-pattern) +### *See Also* + +- [Singleton Pattern](../19%20Misc/Design%20Patterns.md#singleton-pattern) ## Annotation 기반 설정 사용 시 주의점 @@ -56,7 +56,7 @@ List userList = service.getUsernameList(); `@Autowired`가 필요할 수 있다. 생성자가 하나인 경우 알아서 autowiring이 가능해서 `@Autowired`가 필요 없다. -> **References** -> -> - [Classpath Scanning and Managed Components](https://docs.spring.io/spring-framework/reference/core/beans/classpath-scanning.html) -> - [Java-based Container Configuration](https://docs.spring.io/spring-framework/reference/core/beans/java.html) +### *References* + +- [Classpath Scanning and Managed Components](https://docs.spring.io/spring-framework/reference/core/beans/classpath-scanning.html) +- [Java-based Container Configuration](https://docs.spring.io/spring-framework/reference/core/beans/java.html) diff --git a/content/10 Wiki/13 Spring/13.03 AOP.md b/content/10 Wiki/13 Spring/13.03 AOP.md index 3554497..5c94ff7 100644 --- a/content/10 Wiki/13 Spring/13.03 AOP.md +++ b/content/10 Wiki/13 Spring/13.03 AOP.md @@ -12,7 +12,7 @@ tags: - 공통된 목적을 가진 데이터와 동작을 묶어 하나의 객체로 정의 - 객체의 활용으로 재사용성 높음 - 관심사 분리 원칙 준수 - - Spring MVC에서는 `@Controller`, `@Service`, `@Repository`로 계층 분리 + - Spring MVC에서는 `@Controller`, `@Service`, `@Repository`로 계층 분리 #### OOP의 한계 @@ -51,16 +51,16 @@ tags: - Pointcut으로 결정한 타겟의 join point에 advice를 적용하는 것 - 실행 시점에 따른 분류 - - Compile time (e.g. AspectJ compiler) - - Load time - - Runtime (e.g. Spring AOP, 그 외 순수 Java AOP 프레임워크) + - Compile time (e.g. AspectJ compiler) + - Load time + - Runtime (e.g. Spring AOP, 그 외 순수 Java AOP 프레임워크) ### AOP proxy - AOP 구현을 위해 만들어지는 프록시 객체 - Spring AOP에서 사용되는 프록시 종류 - - [JDK 동적 프록시](https://docs.oracle.com/javase/8/docs/technotes/guides/reflection/proxy.html): 기본값, 인터페이스를 프록시화 - - CGLIB 프록시: 인터페이스로 구현하지 않아서 클래스를 프록시화할 때 사용 + - [JDK 동적 프록시](https://docs.oracle.com/javase/8/docs/technotes/guides/reflection/proxy.html): 기본값, 인터페이스를 프록시화 + - CGLIB 프록시: 인터페이스로 구현하지 않아서 클래스를 프록시화할 때 사용 ### Target @@ -72,9 +72,9 @@ tags: - Spring AOP에서 사용되는 개념 - 하나의 advice와 하나의 pointcut으로 구성 -> **References** -> -> - [AOP Concepts](https://docs.spring.io/spring-framework/reference/core/aop/introduction-defn.html) +### *References* + +- [AOP Concepts](https://docs.spring.io/spring-framework/reference/core/aop/introduction-defn.html) ## @AspectJ Advice @@ -112,12 +112,12 @@ tags: - `throw`문으로 예외 변환 가능 - `try-catch-finally` 구문 사용 가능 -> **References** -> -> - [Declaring Advice](https://docs.spring.io/spring-framework/reference/core/aop/ataspectj/advice.html) -> - [Appendix A. AspectJ Quick Reference](https://www.eclipse.org/aspectj/doc/released/progguide/quick.html) -> -> **Further Reading** -> -> - [Aspect Oriented Programming with Spring](https://docs.spring.io/spring-framework/reference/core/aop.html) -> - [Spring AOP APIs](https://docs.spring.io/spring-framework/reference/core/aop-api.html) +### *References* + +- [Declaring Advice](https://docs.spring.io/spring-framework/reference/core/aop/ataspectj/advice.html) +- [Appendix A. AspectJ Quick Reference](https://www.eclipse.org/aspectj/doc/released/progguide/quick.html) + +### *Further Reading* + +- [Aspect Oriented Programming with Spring](https://docs.spring.io/spring-framework/reference/core/aop.html) +- [Spring AOP APIs](https://docs.spring.io/spring-framework/reference/core/aop-api.html) diff --git a/content/10 Wiki/13 Spring/13.04 MVC.md b/content/10 Wiki/13 Spring/13.04 MVC.md index 4fdd46a..553eefb 100644 --- a/content/10 Wiki/13 Spring/13.04 MVC.md +++ b/content/10 Wiki/13 Spring/13.04 MVC.md @@ -20,9 +20,9 @@ Spring MVC는 `DispatcherServlet`이 애플리케이션의 중심에서 요청 5. `ViewResolver`에게 받은 `View` 정보를 바탕으로 `DispatcherServlet`이 `View`에게 응답 데이터 생성(렌더링)을 위임한다. 6. `View`로부터 받은 응답 데이터를 `DispatcherServlet`이 클라이언트로 전달한다. -> **References** -> -> - [`DispatcherServlet`](https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-servlet.html) +### *References* + +- [`DispatcherServlet`](https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-servlet.html) ## [`@SpringBootApplication`](https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/SpringBootApplication.html) @@ -32,22 +32,24 @@ Spring MVC는 `DispatcherServlet`이 애플리케이션의 중심에서 요청 - [Method Arguments](https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/arguments.html) - [Return Values](https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/return-types.html) - - [`ResponseEntity`](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/ResponseEntity.html) + - [`ResponseEntity`](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/ResponseEntity.html) + +### *Further Reading* -> **Further Reading** -> -> - [MIME types (IANA media types) - HTTP | MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_Types) -> - [HTTP request methods - HTTP | MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods) -> - [HTTP response status codes - HTTP | MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status) +- [MIME types (IANA media types) - HTTP | MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_Types) +- [HTTP request methods - HTTP | MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods) +- [HTTP response status codes - HTTP | MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status) ## [HTTP Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers) - [`HttpServletRequest`](https://jakarta.ee/specifications/servlet/5.0/apidocs/jakarta/servlet/http/httpservletrequest)에서 요청 header를 확인할 수 있고, [`HttpServletResponse`](https://jakarta.ee/specifications/servlet/5.0/apidocs/jakarta/servlet/http/httpservletresponse)에 응답 header를 설정할 수 있다. - [User-Agent](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent) -- **Custom Headers** - - [HTTP headers and Application Load Balancers, AWS ELB](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/x-forwarded-headers.html) - - [Create custom headers in backend services, Google Cloud Load Balancing](https://cloud.google.com/load-balancing/docs/https/custom-headers) + +### Custom Headers + +- [HTTP headers and Application Load Balancers, AWS ELB](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/x-forwarded-headers.html) +- [Create custom headers in backend services, Google Cloud Load Balancing](https://cloud.google.com/load-balancing/docs/https/custom-headers) ## REST Clients @@ -75,17 +77,21 @@ Spring MVC는 `DispatcherServlet`이 애플리케이션의 중심에서 요청 - 핸들러 메서드에서 `@Valid`나 `@Validated`를 `@RequestBody`와 같은 매개변수에 써서 인자로 들어오는 객체를 validation할 수 있다. - 메서드 매개변수에 `@Positive` 등 Java Bean Validation API를 사용하려면 클래스나 메서드에 `@Validated`를 작성해야 한다. - - 인자로 들어오는 객체 자체를 validation하는 데에는 굳이 클래스, 메서드 단계에 `@Validated`를 작성할 필요없다. + - 인자로 들어오는 객체 자체를 validation하는 데에는 굳이 클래스, 메서드 단계에 `@Validated`를 작성할 필요없다. + +#### *References* -> References -> -> - [`@RequestBody`](https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/requestbody.html) +- [`@RequestBody`](https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/requestbody.html) -## [Lombok](https://projectlombok.org/features/all) +## [Lombok] + +[Lombok]: https://projectlombok.org/features/all `@Getter`, `@Setter`, `@AllArgsConstructor`, `@NoArgsConstructor`, `@Data`, `@ToString` -## [MapStruct](https://mapstruct.org/) +## [MapStruct] + +[MapStruct]: https://mapstruct.org/ ### Gradle Configuration @@ -111,9 +117,9 @@ dependencies { - [mapstruct/mapstruct-examples](https://github.com/mapstruct/mapstruct-examples) -> **References** -> -> - [MapStruct Reference Guide](https://mapstruct.org/documentation/stable/reference/html/) +### *References* + +- [MapStruct Reference Guide](https://mapstruct.org/documentation/stable/reference/html/) ## Exception Handling @@ -127,12 +133,12 @@ dependencies { - [ControllerAdvice](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/ControllerAdvice.html) -> **References** -> -> - [Model](https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-modelattrib-methods.html) -> - [`DataBinder`](https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-initbinder.html) -> - [Exceptions](https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-exceptionhandler.html) -> - [Controller Advice](https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-advice.html) +### *References* + +- [Model](https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-modelattrib-methods.html) +- [`DataBinder`](https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-initbinder.html) +- [Exceptions](https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-exceptionhandler.html) +- [Controller Advice](https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-advice.html) ### Checked vs Unchecked Exceptions diff --git a/content/10 Wiki/13 Spring/13.06 Data JPA.md b/content/10 Wiki/13 Spring/13.06 Data JPA.md index 37e788f..e7ea4e7 100644 --- a/content/10 Wiki/13 Spring/13.06 Data JPA.md +++ b/content/10 Wiki/13 Spring/13.06 Data JPA.md @@ -14,12 +14,12 @@ tags: - `em.flush()`: 영속성 컨텍스트의 변경 사항을 테이블에 반영 - `tx.commit()`: `tx.begin()` 이후 변경 사항을 테이블에 반영, 내부적으로 `em.flush()` 호출 -> **References** -> -> - [Jakarta Persistence - Wikipedia](https://en.wikipedia.org/wiki/Jakarta_Persistence) -> - [`EntityManager`](https://jakarta.ee/specifications/persistence/3.1/apidocs/jakarta.persistence/jakarta/persistence/entitymanager) -> - [`EntityTransaction`](https://jakarta.ee/specifications/persistence/3.1/apidocs/jakarta.persistence/jakarta/persistence/entitytransaction) -> - [Hibernate ORM](https://hibernate.org/orm/) +### *References* + +- [Jakarta Persistence - Wikipedia](https://en.wikipedia.org/wiki/Jakarta_Persistence) +- [`EntityManager`](https://jakarta.ee/specifications/persistence/3.1/apidocs/jakarta.persistence/jakarta/persistence/entitymanager) +- [`EntityTransaction`](https://jakarta.ee/specifications/persistence/3.1/apidocs/jakarta.persistence/jakarta/persistence/entitytransaction) +- [Hibernate ORM](https://hibernate.org/orm/) ## 엔티티 매핑 @@ -27,22 +27,22 @@ tags: - `@Table`: 엔티티와 매핑할 테이블을 지정, 추가하지 않으면 엔티티 이름과 동일한 테이블에 매핑 - `@Entity`, `@Id` - 필수 - JPA 기본키 생성 전략 - - `IDENTITY`: 데이터베이스에 위임 - 별도의 commit 없이도 DB에 저장됨 - - `SEQUENCE`: 데이터베이스에서 제공하는 시퀀스를 사용 - - `TABLE`: 별도의 키 생성 테이블 사용 - - `AUTO`: JPA가 데이터베이스의 Dialect에 따라서 적절한 전략을 자동으로 선택 + - `IDENTITY`: 데이터베이스에 위임 - 별도의 commit 없이도 DB에 저장됨 + - `SEQUENCE`: 데이터베이스에서 제공하는 시퀀스를 사용 + - `TABLE`: 별도의 키 생성 테이블 사용 + - `AUTO`: JPA가 데이터베이스의 Dialect에 따라서 적절한 전략을 자동으로 선택 - 원시 타입 필드의 경우 `null`을 담을 수 없기 때문에 최소한 `@Column(nullable = false)` 을 추가하는 것이 에러를 방지하는 데에 좋다. - 시간 및 날짜 - - `java.util.Date`, `java.util.Calendar`: `@Temporal` 추가 필수 - - `LocalDate`, `LocalDateTime`: `@Temporal` 생략 가능 + - `java.util.Date`, `java.util.Calendar`: `@Temporal` 추가 필수 + - `LocalDate`, `LocalDateTime`: `@Temporal` 생략 가능 - `@Transient`: 테이블 컬럼과 매핑하지 않는 필드 표시 - `@Enumerated` 사용시 테이블에 저장된 enum 순서 번호와 엔티티 enum에 정의된 순서가 불일치하게 되는 문제가 발생하지 않도록 `EnumType.ORDINAL`대신 `EnumType.STRING`을 사용하는 것이 좋다. -> **References** -> -> - [2.2 Basic values](https://docs.jboss.org/hibernate/orm/6.3/userguide/html_single/Hibernate_User_Guide.html#basic) -> - [2.6. Access strategies](https://docs.jboss.org/hibernate/orm/6.3/userguide/html_single/Hibernate_User_Guide.html#access) -> - [2.7 Identifiers](https://docs.jboss.org/hibernate/orm/6.3/userguide/html_single/Hibernate_User_Guide.html#identifiers) +### *References* + +- [2.2 Basic values](https://docs.jboss.org/hibernate/orm/6.3/userguide/html_single/Hibernate_User_Guide.html#basic) +- [2.6. Access strategies](https://docs.jboss.org/hibernate/orm/6.3/userguide/html_single/Hibernate_User_Guide.html#access) +- [2.7 Identifiers](https://docs.jboss.org/hibernate/orm/6.3/userguide/html_single/Hibernate_User_Guide.html#identifiers) ## 엔티티 간 연관 관계 매핑 @@ -50,11 +50,11 @@ tags: - `@JoinColumn` - `@OneToMany(mappedBy = "fieldName")` -> **References** -> -> - [2.8 Associations](https://docs.jboss.org/hibernate/orm/6.3/userguide/html_single/Hibernate_User_Guide.html#associations) -> - [11. Fetching](https://docs.jboss.org/hibernate/orm/6.3/userguide/html_single/Hibernate_User_Guide.html#fetching) -> - [5.15. Cascading entity state transitions](https://docs.jboss.org/hibernate/orm/6.3/userguide/html_single/Hibernate_User_Guide.html#pc-cascade) +### *References* + +- [2.8 Associations](https://docs.jboss.org/hibernate/orm/6.3/userguide/html_single/Hibernate_User_Guide.html#associations) +- [11. Fetching](https://docs.jboss.org/hibernate/orm/6.3/userguide/html_single/Hibernate_User_Guide.html#fetching) +- [5.15. Cascading entity state transitions](https://docs.jboss.org/hibernate/orm/6.3/userguide/html_single/Hibernate_User_Guide.html#pc-cascade) ## Spring Data JPA를 통한 데이터 엑세스 계층 구현 @@ -64,9 +64,9 @@ tags: [Java Persistence/JPQL - Wikibooks, open books for an open world](https://en.wikibooks.org/wiki/Java_Persistence/JPQL) -> **Further Reading** -> -> - [8.6. Configure Hibernate Naming Strategy](https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto.data-access.configure-hibernate-naming-strategy) +#### *Further Reading* + +- [8.6. Configure Hibernate Naming Strategy](https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto.data-access.configure-hibernate-naming-strategy) ## Spring Data JPA Properties in Spring Boot application.yml @@ -116,10 +116,10 @@ spring: - `@EntityListeners(AuditingEntityListener.class)` - `AuditorAware` -> **References** -> -> - [5.1.9. Auditing](https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#auditing) -> - [5.1.10. JPA Auditing](https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.auditing) +### *References* + +- [5.1.9. Auditing](https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#auditing) +- [5.1.10. JPA Auditing](https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.auditing) ## `@MappedSuperclass` diff --git a/content/10 Wiki/13 Spring/13.07 Transactions.md b/content/10 Wiki/13 Spring/13.07 Transactions.md index 90ff934..f37447a 100644 --- a/content/10 Wiki/13 Spring/13.07 Transactions.md +++ b/content/10 Wiki/13 Spring/13.07 Transactions.md @@ -5,9 +5,13 @@ tags: --- # Transactions in Spring -## [트랜잭션](https://en.wikipedia.org/wiki/Database_transaction) +## [트랜잭션] -### [ACID](https://en.wikipedia.org/wiki/ACID) +[트랜잭션]: https://en.wikipedia.org/wiki/Database_transaction + +### [ACID] + +[ACID]: https://en.wikipedia.org/wiki/ACID 데이터베이스 내에서 트랜잭션의 안전성을 보장하기 위해 필요한 성질들 @@ -55,6 +59,6 @@ tags: - [Atomikos Documentation wiki](https://www.atomikos.com/Documentation/WebHome) - [Setting up JPA with JTA Transaction Management](https://docs.spring.io/spring-framework/reference/data-access/orm/jpa.html#orm-jpa-jta) -> **Further Reading** -> -> - [Apache NiFi Documentation](https://nifi.apache.org/docs.html) +### *Further Reading* + +- [Apache NiFi Documentation](https://nifi.apache.org/docs.html) diff --git a/content/10 Wiki/13 Spring/13.08 Testing.md b/content/10 Wiki/13 Spring/13.08 Testing.md index 320b78c..ae5f076 100644 --- a/content/10 Wiki/13 Spring/13.08 Testing.md +++ b/content/10 Wiki/13 Spring/13.08 Testing.md @@ -19,15 +19,17 @@ tags: - Self-validating - Timely -### [Given-When-Then](https://martinfowler.com/bliki/GivenWhenThen.html) +### [Given-When-Then] + +[Given-When-Then]: https://martinfowler.com/bliki/GivenWhenThen.html - Given: 테스트 전 상태, 조건 - When: 테스트 동작 - Then: 테스트 결과 검증 -> **Further Reading** -> -> - [Behavior-driven development - Wikipedia](https://en.wikipedia.org/wiki/Behavior-driven_development) +#### *Further Reading* + +- [Behavior-driven development - Wikipedia](https://en.wikipedia.org/wiki/Behavior-driven_development) ## Java Testing Frameworks @@ -41,10 +43,10 @@ tags: - [Hamcrest Tutorial](http://hamcrest.org/JavaHamcrest/tutorial) - [Hamcrest 2.2 API](http://hamcrest.org/JavaHamcrest/javadoc/2.2/) -> **Other Testing Frameworks** -> -> - [TestNG](https://testng.org/doc/) -> - [Spock](https://spockframework.org/) +### Other Testing Frameworks + +- [TestNG](https://testng.org/doc/) +- [Spock](https://spockframework.org/) ## Test Slicing in Spring @@ -53,19 +55,19 @@ tags: - `@SpringBootTest`, `@AutoConfigureMockMvc`, `MockMvc` - Tomcat 구동 없이 테스트 가능 -> **References** -> -> - [8.3. Testing Spring Boot Applications](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.testing.spring-boot-applications) -> - [MockMvc](https://docs.spring.io/spring-framework/reference/testing/spring-mvc-test-framework.html) -> -> **Further Reading** -> -> - [Smoke testing (software) - Wikipedia](https://en.wikipedia.org/wiki/Smoke_testing_(software)) -> - [**Jayway JsonPath**](https://github.com/json-path/JsonPath) -> - [Introduction to JsonPath](https://www.baeldung.com/guide-to-jayway-jsonpath) -> - [`MockMvcResultMatchers` (API)](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/web/servlet/result/MockMvcResultMatchers.html#jsonPath-java.lang.String-java.lang.Object) -> - [`JsonPathResultMatchers` (API)](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/web/servlet/result/JsonPathResultMatchers.html) -> - [GitHub - google/gson: A Java serialization/deserialization library to convert Java Objects into JSON and back](https://github.com/google/gson) +#### *References* + +- [8.3. Testing Spring Boot Applications](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.testing.spring-boot-applications) +- [MockMvc](https://docs.spring.io/spring-framework/reference/testing/spring-mvc-test-framework.html) + +#### *Further Reading* + +- [Smoke testing (software) - Wikipedia](https://en.wikipedia.org/wiki/Smoke_testing_(software)) +- [**Jayway JsonPath**](https://github.com/json-path/JsonPath) + - [Introduction to JsonPath](https://www.baeldung.com/guide-to-jayway-jsonpath) + - [`MockMvcResultMatchers` (API)](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/web/servlet/result/MockMvcResultMatchers.html#jsonPath-java.lang.String-java.lang.Object) + - [`JsonPathResultMatchers` (API)](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/web/servlet/result/JsonPathResultMatchers.html) +- [GitHub - google/gson: A Java serialization/deserialization library to convert Java Objects into JSON and back](https://github.com/google/gson) ### 데이터 액세스 계층 테스트 @@ -74,14 +76,15 @@ tags: - Spring Data JDBC: `@DataJdbcTest` - Spring Boot에서 `@Transactional`을 포함한 테스트는 테스트 메소드를 마치고 해당 트랜잭션을 롤백하는 것을 기본값으로 한다. -> **References** -> -> - [Enabling and Disabling Transactions](https://docs.spring.io/spring-framework/reference/testing/testcontext-framework/tx.html#testcontext-tx-enabling-transactions) -> - [8.3.21. Auto-configured Data JPA Tests](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.testing.spring-boot-applications.autoconfigured-spring-data-jpa) +#### *References* -### Mockito +- [Enabling and Disabling Transactions](https://docs.spring.io/spring-framework/reference/testing/testcontext-framework/tx.html#testcontext-tx-enabling-transactions) +- [8.3.21. Auto-configured Data JPA Tests](https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.testing.spring-boot-applications.autoconfigured-spring-data-jpa) + +### [Mockito] + +[Mockito]: https://site.mockito.org/ -- [Mockito framework site](https://site.mockito.org/) - [Mockito - mockito-core javadoc](https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html) #### Mock, Stub, and Fake @@ -90,12 +93,14 @@ Mock, stub, fake는 비슷한 의미를 가지고 있어서 혼용되곤 한다. 사용하는 사람, 문서에 따라 각각의 정의를 다르게 하는 경우가 있어서 정확한 구분도 힘들다. Mockito 등 사용하는 라이브러리에서의 용법을 따르는 것이 맞는 것 같다. -> **References** -> -> - [What's the difference between a mock & stub?](https://stackoverflow.com/questions/3459287/whats-the-difference-between-a-mock-stub) -> - [Mocks Aren't Stubs](https://martinfowler.com/articles/mocksArentStubs.html) +##### *References* + +- [What's the difference between a mock & stub?](https://stackoverflow.com/questions/3459287/whats-the-difference-between-a-mock-stub) +- [Mocks Aren't Stubs](https://martinfowler.com/articles/mocksArentStubs.html) -## [TDD](https://en.wikipedia.org/wiki/Test-driven_development) +## [TDD] + +[TDD]: https://en.wikipedia.org/wiki/Test-driven_development - 필요한 모든 조건을 확인하는 테스트를 먼저 작성한 후 실패하는 테스트를 점진적으로 성공시켜 가는 식으로 개발 - 테스트 실행 결과가 `failed`인 테스트 케이스를 지속적, 단계적으로 테스트 케이스 실행 결과가 `passed`가 되도록 수정 @@ -106,7 +111,7 @@ Mockito 등 사용하는 라이브러리에서의 용법을 따르는 것이 맞 - 테스트와 기능 구현, 리팩토링까지 빠르게 진행 가능 - 테스트를 통과 할 만큼의 기능을 구현하므로 한번에 많은 기능을 구현할 필요가 없음 - 테스트의 코드가 추가되면서 검증하는 범위가 넓어질 수록 기능 구현도 점진적으로 완성 - - 단순한 기능에서 복잡한 기능으로 확장되면서 그때그때 검증을 놓치지 않을 수 있음 + - 단순한 기능에서 복잡한 기능으로 확장되면서 그때그때 검증을 놓치지 않을 수 있음 - 리팩토링을 그때그때 빠르게 진행하기 때문에 리팩토링의 비용이 상대적으로 줄어듬 - 테스트 케이스가 있기 때문에 코드 수정에 부담이 적음 - 리팩토링을 통해 꾸준히 코드를 개선하므로 코드 품질 유지에 유리 @@ -118,8 +123,8 @@ Mockito 등 사용하는 라이브러리에서의 용법을 따르는 것이 맞 - 테스트 코드의 작성에 익숙하지 않거나 작성을 원치 않는 경우에 적용할 수 없음 - 팀 단위로 개발을 진행해야 하므로 팀원 간 사전 협의 필요 -> **Further Reading** -> -> - [Agile software development - Wikipedia](https://en.wikipedia.org/wiki/Agile_software_development) -> - [What is TDD? Everything About Test Driven Development](https://www.simform.com/blog/what-is-tdd/) -> - [Kent Beck - Wikipedia](https://en.wikipedia.org/wiki/Kent_Beck) +### *Further Reading* + +- [Agile software development - Wikipedia](https://en.wikipedia.org/wiki/Agile_software_development) +- [What is TDD? Everything About Test Driven Development](https://www.simform.com/blog/what-is-tdd/) +- [Kent Beck - Wikipedia](https://en.wikipedia.org/wiki/Kent_Beck) diff --git a/content/10 Wiki/13 Spring/13.09 Security.md b/content/10 Wiki/13 Spring/13.09 Security.md index bb4651a..730ff12 100644 --- a/content/10 Wiki/13 Spring/13.09 Security.md +++ b/content/10 Wiki/13 Spring/13.09 Security.md @@ -8,10 +8,6 @@ tags: - [Spring Security](https://docs.spring.io/spring-security/reference/index.html) -> **Another Framework** -> -> - [Apache Shiro | Simple. Java. Security.](https://shiro.apache.org/) - ## Password Storage - [Password Storage](https://docs.spring.io/spring-security/reference/features/authentication/password-storage.html#authentication-password-storage) @@ -64,3 +60,7 @@ tags: - [`CommonOAuth2Provider`](https://docs.spring.io/spring-security/reference/servlet/oauth2/login/core.html#oauth2login-common-oauth2-provider) - [`OAuth2AuthorizedClient` (API)](https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/oauth2/client/OAuth2AuthorizedClient.html) - [Core Interfaces and Classes](https://docs.spring.io/spring-security/reference/servlet/oauth2/client/core.html) + +## *Another Security Framework* + +- [Apache Shiro | Simple. Java. Security.](https://shiro.apache.org/) diff --git a/content/10 Wiki/19 Misc/Computer Networks.md b/content/10 Wiki/19 Misc/Computer Networks.md index 3bdfcce..7e9c34e 100644 --- a/content/10 Wiki/19 Misc/Computer Networks.md +++ b/content/10 Wiki/19 Misc/Computer Networks.md @@ -59,7 +59,7 @@ tags: - [MAC](https://en.wikipedia.org/wiki/Medium_access_control) - [ARP](https://en.wikipedia.org/wiki/Address_Resolution_Protocol) - - OSI 2.5 layer, network와 data link 사이 + - OSI 2.5 layer, network와 data link 사이 - [QUIC - Wikipedia](https://en.wikipedia.org/wiki/QUIC) ### 패킷 diff --git a/content/10 Wiki/19 Misc/Design Patterns.md b/content/10 Wiki/19 Misc/Design Patterns.md index d43b150..12c4aac 100644 --- a/content/10 Wiki/19 Misc/Design Patterns.md +++ b/content/10 Wiki/19 Misc/Design Patterns.md @@ -4,22 +4,25 @@ tags: --- # Design Patterns -## Builder Pattern +## [Builder Pattern] -- [Builder Pattern](https://en.wikipedia.org/wiki/Builder_pattern) +[Builder Pattern]: https://en.wikipedia.org/wiki/Builder_pattern -## Factory Method Pattern +## [Factory Method Pattern] + +[Factory Method Pattern]: https://en.wikipedia.org/wiki/Factory_method_pattern -- [Factory Method Pattern](https://en.wikipedia.org/wiki/Factory_method_pattern) - [List.of](), [Stream.of]()와 같이 생성자가 아닌 static factory method로 객체를 생성 - [SPI (Service Provicer Interface)](https://en.wikipedia.org/wiki/Service_provider_interface)에서 많이 사용 - - e.g. `Class.forName("com.mysql.jdbc.Driver")` + - e.g. `Class.forName("com.mysql.jdbc.Driver")` + +## [Strategy Pattern] -## Strategy Pattern +[Strategy Pattern]: https://en.wikipedia.org/wiki/Strategy_pattern -- [Strategy Pattern](https://en.wikipedia.org/wiki/Strategy_pattern) +## [Singleton Pattern] -## Singleton Pattern +[Singleton pattern]: https://en.wikipedia.org/wiki/Singleton_pattern 클래스를 하나의 인스턴스로만 사용하는 패턴 @@ -27,22 +30,21 @@ tags: - 추가적인 코드가 필요 (큰 문제점은 아님) - 클라이언트가 구체 클래스에 의존한다. (tight coupling) - - 테스트할 때에도 불편함이 있다. + - 테스트할 때에도 불편함이 있다. - private 생성자를 사용하여 자식 클래스를 만들기 어렵다. - 속성을 공유하게 되어 멀티쓰레드 환경에서 문제가 생길 수 있다. - - 가급적 무상태, 읽기만 가능하게 구현해야 한다. + - 가급적 무상태, 읽기만 가능하게 구현해야 한다. - 애플리케이션 초기 구동 시 인스턴스를 생성하게 되어 여러 싱글턴 클래스가 있는 경우 구동 시간이 오래걸릴 수 있다. - - Lazy initialization을 구현하면 해결할 수 있다. + - Lazy initialization을 구현하면 해결할 수 있다. ### *References* -- [Singleton pattern](https://en.wikipedia.org/wiki/Singleton_pattern) - [What are drawbacks or disadvantages of singleton pattern?](https://stackoverflow.com/questions/137975/what-are-drawbacks-or-disadvantages-of-singleton-pattern) ### *Further Reading* - [Initialization-on-demand holder idiom - Wikipedia](https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom) -## Front controller +## [Front controller] -- [Front Controller](https://en.wikipedia.org/wiki/Front_controller) +[Front Controller]: https://en.wikipedia.org/wiki/Front_controller diff --git a/content/10 Wiki/19 Misc/Git.md b/content/10 Wiki/19 Misc/Git.md index adfde38..0ee2656 100644 --- a/content/10 Wiki/19 Misc/Git.md +++ b/content/10 Wiki/19 Misc/Git.md @@ -8,8 +8,8 @@ draft: "true" ## To Do - [ ] `git submodule` - - [ ] recurse - - [ ] --remote + - [ ] recurse + - [ ] --remote - [ ] `git rm --cache` - [ ] `` - [ ] `git pull` recursive diff --git a/content/10 Wiki/19 Misc/HTML & CSS.md b/content/10 Wiki/19 Misc/HTML & CSS.md index b21f946..4c5ba26 100644 --- a/content/10 Wiki/19 Misc/HTML & CSS.md +++ b/content/10 Wiki/19 Misc/HTML & CSS.md @@ -363,9 +363,9 @@ float: right; - HTML 문서는 브라우저 마다 기본적인 스타일을 가지고 있다. - 이런 기본 스타일이 전체적인 레이아웃을 설정할 때에는 방해가 될 수 있다. - 방해가 되는 요소는 예를 들어 다음과 같다. - - `` 요소의 기본 여백 - - `width`, `height` 속성이 여백을 포함하지 않음 - - 브라우저에 따라 다른 여백, 글꼴 + - `` 요소의 기본 여백 + - `width`, `height` 속성이 여백을 포함하지 않음 + - 브라우저에 따라 다른 여백, 글꼴 - 이런 문제를 해결하기 위해 [Normalize.css]와 같은 라이브러리로 CSS 리셋을 할 수 있지만 모던 웹 환경에서는 기본 스타일 자체도 큰 문제가 없는 경우가 많아서 최소한의 리셋만 적용하는 것으로도 충분하다. - 아래와 같은 코드를 CSS 앞부분에 추가하여 원하는 결과를 얻을 수 있다. diff --git a/content/10 Wiki/19 Misc/RDBs.md b/content/10 Wiki/19 Misc/RDBs.md index f4f9079..18e2858 100644 --- a/content/10 Wiki/19 Misc/RDBs.md +++ b/content/10 Wiki/19 Misc/RDBs.md @@ -5,21 +5,76 @@ tags: --- # Relational Databases -## [데이터베이스](https://en.wikipedia.org/wiki/Database) +## [데이터베이스] -### [RDB](https://en.wikipedia.org/wiki/Relational_database) vs [NoSQL](https://en.wikipedia.org/wiki/NoSQL) +[데이터베이스]: https://en.wikipedia.org/wiki/Database -| 차이점 | RDB | NoSQL | -| :--: | ---- | ---- | -| 데이터 저장
(Storage) | SQL을 사용하여 데이터를 테이블에 저장 | Key-value, document, wide-column, graph 등의 방식으로 저장 | -| 스키마
(Schema) | 고정된 형식의 스키마 데이터 속성별로 열(column)에 대한 정보를 미리 정해두어야 함
스키마를 수정하려면 데이터베이스 전체를 수정하거나 down-time이 필요 | 동적으로 스키마의 형태를 관리 행을 추가할 때 새로운 열을 추가할 수 있고 개별 속성에 대해서 모든 열에 대한 데이터를 반드시 입력할 필요가 없음 | -| 쿼리
(Querying) | 테이블의 형식, 테이블 간의 관계에 맞춰서 SQL과 같이 구조화된 쿼리 언어로 요청 | 데이터 그룹 자체를 조회
구조화되지 않은 쿼리 언어로도 요청 가능 | -| 확장성
(Scalability) | 수직적 확장
높은 메모리, CPU 사용
상대적 고비용
여러 서버에 걸쳐서 구성하기 복잡함 | 수평적 확장
클라우드 서비스, 범용 하드웨어 사용
상대적 저비용
여러 서버에 걸쳐서 구성이 가능 | -| 사용 분야 | 1. ACID 성질을 준수해야 하는 경우 (e.g. 전자상거래 등 금융서비스)
2. 사용되는 데이터가 구조적이고 일관적인 경우
| 1. 구조가 거의 또는 전혀 없는 대용량 데이터를 저장하는 경우
2. 클라우드 컴퓨팅, 스토리지를 활용하는 경우
3. 데이터 구조를 자주 업데이트하는 경우 | +### [RDB] -## [SQL](https://en.wikipedia.org/wiki/SQL) +[RDB]: https://en.wikipedia.org/wiki/Relational_database -### [SQL syntax](https://en.wikipedia.org/wiki/SQL_syntax) +#### 데이터 저장 (Storage) + +- SQL을 사용하여 데이터를 테이블에 저장 + +#### 스키마 (Schema) + +- 고정된 형식의 스키마 데이터 속성별로 열(column)에 대한 정보를 미리 정해두어야 함 +- 스키마를 수정하려면 데이터베이스 전체를 수정하거나 down-time이 필요 + +#### 쿼리 (Querying) + +- 테이블의 형식, 테이블 간의 관계에 맞춰서 SQL과 같이 구조화된 쿼리 언어로 요청 + +#### 확장성 (Scalability) + +- 수직적 확장 +- 높은 메모리, CPU 사용 +- 상대적 고비용 +- 여러 서버에 걸쳐서 구성하기 복잡함 + +#### 사용 분야 + +- ACID 성질을 준수해야 하는 경우 (e.g. 전자상거래 등 금융서비스) +- 사용되는 데이터가 구조적이고 일관적인 경우 + +### [NoSQL] + +[NoSQL]: https://en.wikipedia.org/wiki/NoSQL + +#### 데이터 저장 (Storage) + +- Key-value, document, wide-column, graph 등의 방식으로 저장 + +#### 스키마 (Schema) + +- 동적으로 스키마의 형태를 관리 행을 추가할 때 새로운 열을 추가할 수 있고 개별 속성에 대해서 모든 열에 대한 데이터를 반드시 입력할 필요가 없음 + +#### 쿼리 (Querying) + +- 데이터 그룹 자체를 조회 +- 구조화되지 않은 쿼리 언어로도 요청 가능 + +#### 확장성 (Scalability) + +- 수평적 확장 +- 클라우드 서비스, 범용 하드웨어 사용 +- 상대적 저비용 +- 여러 서버에 걸쳐서 구성이 가능 + +#### 사용 분야 + +- 구조가 거의 또는 전혀 없는 대용량 데이터를 저장하는 경우 +- 클라우드 컴퓨팅, 스토리지를 활용하는 경우 +- 데이터 구조를 자주 업데이트하는 경우 + +## [SQL] + +[SQL]: https://en.wikipedia.org/wiki/SQL + +### [SQL syntax] + +[SQL syntax]: https://en.wikipedia.org/wiki/SQL_syntax ### 분류 @@ -29,20 +84,26 @@ tags: - [DCL](https://en.wikipedia.org/wiki/Data_control_language) - [TCL](https://en.wikipedia.org/wiki/SQL_syntax#Transaction_controls) -## [ACID](https://en.wikipedia.org/wiki/ACID) +## [ACID] + +[ACID]: https://en.wikipedia.org/wiki/ACID + +데이터베이스 내에서 [트랜잭션(transaction)]의 안전성을 보장하기 위해 필요한 성질들 -데이터베이스 내에서 [트랜잭션(transaction)](https://en.wikipedia.org/wiki/Database_transaction)의 안전성을 보장하기 위해 필요한 성질들 +[트랜잭션(transaction)]: https://en.wikipedia.org/wiki/Database_transaction - Atomicity - Consistency - Isolation - Durability -> **Further Reading** -> -> - [CAP theorem - Wikipedia](https://en.wikipedia.org/wiki/CAP_theorem) +### *Further Reading* -## [데이터베이스 정규화 (Database normalization)](https://en.wikipedia.org/wiki/Database_normalization) +- [CAP theorem - Wikipedia](https://en.wikipedia.org/wiki/CAP_theorem) + +## [데이터베이스 정규화 (Database normalization)] + +[데이터베이스 정규화 (Database normalization)]: https://en.wikipedia.org/wiki/Database_normalization - Data redundancy를 줄이고 data integrity를 강화시키도록 데이터베이스를 설계 - 데이터를 변경시키는 경우 발생할 수 있는 anomaly를 방지 @@ -62,9 +123,9 @@ brew services start mysql mysql -u root ``` -> **References** -> -> - [mysql](https://formulae.brew.sh/formula/mysql) +#### *References* + +- [mysql](https://formulae.brew.sh/formula/mysql) ### MySQL documentation diff --git a/content/10 Wiki/19 Misc/Security.md b/content/10 Wiki/19 Misc/Security.md index 0ad4420..4b0f6a1 100644 --- a/content/10 Wiki/19 Misc/Security.md +++ b/content/10 Wiki/19 Misc/Security.md @@ -8,7 +8,9 @@ tags: --- # Security -## [HTTPS](https://en.wikipedia.org/wiki/HTTPS) +## [HTTPS] + +[HTTPS]: https://en.wikipedia.org/wiki/HTTPS - [How HTTPS works](https://howhttps.works/) - [GitHub - alex/what-happens-when: An attempt to answer the age old interview question "What happens when you type google.com into your browser and press enter?"](https://github.com/alex/what-happens-when#tls-handshake) @@ -18,11 +20,11 @@ tags: - [RSA (cryptosystem) - Wikipedia](https://en.wikipedia.org/wiki/RSA_(cryptosystem)) - 공개키로 암호화, 개인키로 복호화 → 보낸 사람과 개인키를 가진 사람만 확인 가능 → 비대칭 암호화 전송 - 개인키로 암호화, 공개키로 복호화 → 개인키를 가진 사람만 암호 생성 가능 → 서명 역할 - - 인증서를 hashing하고 개인키로 암호화하여 서명을 작성 → 인증서를 hashing한 값과 공개키로 서명을 복호화한 값이 같으면 인증서를 발행한, 서명한 사람이 개인키를 가지고 있음이 증명된다. + - 인증서를 hashing하고 개인키로 암호화하여 서명을 작성 → 인증서를 hashing한 값과 공개키로 서명을 복호화한 값이 같으면 인증서를 발행한, 서명한 사람이 개인키를 가지고 있음이 증명된다. + +### *Further Reading* -> **Further Reading** -> -> - [Man-in-the-middle attack - Wikipedia](https://en.wikipedia.org/wiki/Man-in-the-middle_attack) +- [Man-in-the-middle attack - Wikipedia](https://en.wikipedia.org/wiki/Man-in-the-middle_attack) ### 인증서 발급 @@ -34,7 +36,9 @@ tags: - [Adding Salt to Hashing: A Better Way to Store Passwords](https://auth0.com/blog/adding-salt-to-hashing-a-better-way-to-store-passwords/) - [SHA-2 - Wikipedia](https://en.wikipedia.org/wiki/SHA-2) -## [HTTP cookie](https://en.wikipedia.org/wiki/HTTP_cookie) +## [HTTP cookie] + +[HTTP cookie]: https://en.wikipedia.org/wiki/HTTP_cookie - [Using HTTP cookies - HTTP | MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies) - [Set-Cookie - HTTP | MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie) @@ -48,8 +52,8 @@ tags: ### Session Based Authentication - 로그인시 서버에서 인증된 상태, 세션을 저장하고 클라이언트에 있는 쿠키에 저장된 세션을 가리키는 session_id를 담는 방식으로 상태를 유지시킨다. - - 유저 로그인 상태, 장바구니 등 정보를 세션에 저장할 수 있다. - - In-memory, 세션 스토어(redis 등 트랜잭션이 빠른 DB 사용) 등 저장소에 세션을 저장한다. + - 유저 로그인 상태, 장바구니 등 정보를 세션에 저장할 수 있다. + - In-memory, 세션 스토어(redis 등 트랜잭션이 빠른 DB 사용) 등 저장소에 세션을 저장한다. - 로그아웃시 서버에서는 세션을 저장소에서 제거하고 클라이언트에서는 쿠키의 session_id를 무효한 값으로 바꿔줘야 한다. ## 웹 보안 공격 @@ -59,10 +63,10 @@ tags: - [Session fixation](https://owasp.org/www-community/attacks/Session_fixation) - [Clickjacking - Wikipedia](https://en.wikipedia.org/wiki/Clickjacking) -> **Further Reading** -> -> - [OWASP Foundation, the Open Source Foundation for Application Security | OWASP Foundation](https://owasp.org/) -> - [Rainbow table - Wikipedia](https://en.wikipedia.org/wiki/Rainbow_table) +### *Further Reading* + +- [OWASP Foundation, the Open Source Foundation for Application Security | OWASP Foundation](https://owasp.org/) +- [Rainbow table - Wikipedia](https://en.wikipedia.org/wiki/Rainbow_table) ## Session-based Authentication vs Token-based Authentication @@ -96,10 +100,10 @@ tags: → Redis와 같은 key-value 인메모리 DB에 토큰을 저장하고 해당 key-value 쌍의 만료 시간을 최소로 주어 사용할 수 없게 하는 방법 등으로 해결 - CSR 방식의 애플리케이션에 적합 -> **Further Reading** -> -> - [What is Session Stickiness | Pros and Cons of Using Session Cookies | Imperva](https://www.imperva.com/learn/availability/sticky-session-persistence-and-cookies/) -> - [Clustering/Session Replication How-To](https://tomcat.apache.org/tomcat-10.1-doc/cluster-howto.html) +### *Further Reading* + +- [What is Session Stickiness | Pros and Cons of Using Session Cookies | Imperva](https://www.imperva.com/learn/availability/sticky-session-persistence-and-cookies/) +- [Clustering/Session Replication How-To](https://tomcat.apache.org/tomcat-10.1-doc/cluster-howto.html) ## JWT @@ -119,13 +123,13 @@ tags: - JWT 구조상 payload가 Base64로 인코딩되어 쉽게 디코딩 가능 → payload에 민감한 정보를 포함하지 않아야 함 -> **Further Reading** -> -> - [JSON Web Signature - Wikipedia](https://en.wikipedia.org/wiki/JSON_Web_Signature) -> - [RFC 7515 - JSON Web Signature (JWS)](https://datatracker.ietf.org/doc/html/rfc7515) -> - [JSON Web Encryption - Wikipedia](https://en.wikipedia.org/wiki/JSON_Web_Encryption) -> - [RFC 7516 - JSON Web Encryption (JWE)](https://datatracker.ietf.org/doc/html/rfc7516) -> - [RFC 7517: JSON Web Key (JWK)](https://www.rfc-editor.org/rfc/rfc7517.html) +### *Further Reading* + +- [JSON Web Signature - Wikipedia](https://en.wikipedia.org/wiki/JSON_Web_Signature) +- [RFC 7515 - JSON Web Signature (JWS)](https://datatracker.ietf.org/doc/html/rfc7515) +- [JSON Web Encryption - Wikipedia](https://en.wikipedia.org/wiki/JSON_Web_Encryption) +- [RFC 7516 - JSON Web Encryption (JWE)](https://datatracker.ietf.org/doc/html/rfc7516) +- [RFC 7517: JSON Web Key (JWK)](https://www.rfc-editor.org/rfc/rfc7517.html) ## OAuth 2.0