From 24b18e18da23bc7dfd2818d2fd4ab2bb706a891d Mon Sep 17 00:00:00 2001 From: Diger Date: Thu, 8 Aug 2024 23:33:46 +0900 Subject: [PATCH] Update Fix Image Path --- _posts/2022-07-10-Static-Final.md | 112 --------------- _posts/2022-07-16-Git-Branch.md | 85 ------------ _posts/2022-07-25-Hibernate.md | 78 ----------- _posts/2022-07-25-JDBC.md | 81 ----------- _posts/2022-07-25-ORM.md | 76 ---------- _posts/2022-08-09-Java8StreamLambda.md | 11 +- _posts/2023-01-01-Algorithm.md | 64 --------- _posts/2023-01-01-SHORTS-1.md | 2 +- _posts/2023-01-01-SHORTS-2.md | 2 +- _posts/2023-01-01-SHORTS-3.md | 2 +- _posts/2023-01-01-SHORTS-4.md | 2 +- _posts/2023-01-01-SUGO-2.md | 15 -- _posts/2023-01-01-SUWIKI-1.md | 2 +- _posts/2023-01-01-SUWIKI-2.md | 2 +- _posts/2023-01-01-SUWIKI-3.md | 2 +- _posts/2023-01-01-SUWIKI-4.md | 2 +- ...ctsandMisconceptionsofObjectOrientation.md | 83 ----------- _posts/2023-1-1-Spring.md | 131 ------------------ _posts/2023-10-01-Revenge.md | 92 ------------ _posts/2024-08-08-Archive.md | 94 +++++++++++++ 20 files changed, 103 insertions(+), 835 deletions(-) delete mode 100644 _posts/2022-07-10-Static-Final.md delete mode 100644 _posts/2022-07-16-Git-Branch.md delete mode 100644 _posts/2022-07-25-Hibernate.md delete mode 100644 _posts/2022-07-25-JDBC.md delete mode 100644 _posts/2022-07-25-ORM.md delete mode 100644 _posts/2023-01-01-Algorithm.md delete mode 100644 _posts/2023-01-01-SUGO-2.md delete mode 100644 _posts/2023-01-24-FactsandMisconceptionsofObjectOrientation.md delete mode 100644 _posts/2023-1-1-Spring.md delete mode 100644 _posts/2023-10-01-Revenge.md create mode 100644 _posts/2024-08-08-Archive.md diff --git a/_posts/2022-07-10-Static-Final.md b/_posts/2022-07-10-Static-Final.md deleted file mode 100644 index 51f6570d..00000000 --- a/_posts/2022-07-10-Static-Final.md +++ /dev/null @@ -1,112 +0,0 @@ ---- - -title: Static, Final 에 관하여 - -date: 2022-07-10 -categories: [Java] -tags: [Static, Final] -layout: post -toc: true -math: true -mermaid: true - ---- - -# static 이란 - -소속을 정의해주는 것이라고 생각하면 된다. - - class Test { - public static String Value = "Class"; // 클래스 소속 - - public String value = "Instance"; //인스턴스 소속 - - public static void classMethod() { - System.out.println(Value); // OK - System.out.println(value); // Error! - } - - public void InstanceMethod() { - System.out.println(Value); // OK - System.out.println(value); // OK - } - } - - public class StaticApp { - System.out.println(Test.Value); // OK - System.out.println(Test.value); // Error! - } - -
- -> **인스턴스 소속(Static 키워드를 안 붙인경우)** -> -> 인스턴스에 속한, 변수-메서드에 접근할때 -> -> 클래스 단위에서 접근하는 것이 금지되어있다. ex) Test.value, Test.InstanceMethod() -> -> 즉, 클래스에 대한 인스턴스를 만들고 그 인스턴스에 직접 변수와 메서드를 호출해야하는 방식이다. - -
- -> **클래스 소속(Static 키워드를 붙인경우)** -> -> Static 키워드를 가진 변수-메서드에는 클래스 단위든, 인스턴스 단위든 상관없이 호출 가능하다. -> -> 객체 내부에 존재하는 것이 아닌, 별도의 공간에 저장한다. (static 변수-메서드 : JVM - 메서드 영역, 인스턴스 변수-메서드 : JVM - 힙 영역) - -# static 내부 동작 - - // 인스턴스 생성 - Test test = new Test(); - -인스턴스를 생성했을 때, 해당 클래스가 **static** 키워드를 가진 메서드나 변수를 포함하고 있을 때 - -인스턴스가 가지고 있는 내용은, **static** 키워드의 직접적인 내용이 아니라, 참조만 할 뿐이다. - -그렇지 않은 변수-메서드는 인스턴스 내부에 복제된다. - -![image](https://user-images.githubusercontent.com/60564431/178138195-b6a193d8-475c-4096-af73-46249ef0604e.png) - -https://www.youtube.com/watch?v=hvTuZshZvIo 이미지 참고 - -위 그림과, 설명으로도 알수있듯이, 클래스의 static 내용을 변경하게되면, 이를 참조하는 모든 인스턴스의 내용 또한 변한다. - ---- - -# 궁금했던 점 1. 정적 변수 vs 전역 변수 - -Life Cycle 은 두 타입 모두 프로그램이 종료될 때 까지이다. - -Java 에서는 굳이 전역변수를 사용하지 않는다. - -정적변수로 그 기능을 대체하는 것을 보인다. - ----- - -# final 이란 - -추상(abstract)이 상속을 강제하는 것이라면, - -final은 상속/변경을 금지하는 규제이다. - -### 자바 final 정의 - -> 프로그램 실행 중 한 번만 할당 가능하다. -> -> 즉, 재할당 하려고 하면, 컴파일 오류가 발생한다. - - -### final 의 존재 이유 - -final을 알아보려한 이유는, Spring Boot 로 API를 개발할때, - -Service 단에서, Repository를 주입받아 사용할 때 - -private final ~~~Repository 의 형태를 기계적으로 사용해와서 그 이유를 알고싶었다. - -의미를 하나씩 해석을해보면, - -> 호출한 클래스 안에서만 사용가능하다. -> private - -> 새롭게 가져오고자 하는 ~~~Repository 클래스는, 호출한 클래스에서 변경 불가능하다. -> final diff --git a/_posts/2022-07-16-Git-Branch.md b/_posts/2022-07-16-Git-Branch.md deleted file mode 100644 index a3035df6..00000000 --- a/_posts/2022-07-16-Git-Branch.md +++ /dev/null @@ -1,85 +0,0 @@ ---- - -title: Branch 전략, 명령어 정리 -date: 2022-07-16 -categories: [Git] -tags: [Git, Branch] -layout: post -toc: true -math: true -mermaid: true - ---- - -# Git-Flow - -| 브랜치 | 역할 | -|---------|-------------------| -| main | 제품으로 출시될 수 있는 브랜치 | -| develop | 다음 출시 버전을 개발하는 브랜치 | - -
- -|보조브랜치| 역할 | -|---|--------------------------| -| feature | 기능을 개발하는 브랜치 | -| release | 이번 출시 버전을 준비하는 브랜치(QA) | -| hotfix | 출시 버전에서 발생한 버그를 수정하는 브랜치 | - -![Git-Flow](https://user-images.githubusercontent.com/60564431/179346591-d0edee5e-1bff-4600-aee0-330590bdffde.jpg) - -> 위 그림은 브랜치 전략을 그려본 내용이다. -> -> 보조 브랜치는, 병합 후 삭제되어야 한다. - -
- -> 다음과 같은 브랜치 전략을 수행하기 위해서, 브랜치를 다루는 명령어를 알아보자. - ---- - -# Branch Create - - -## 1. 로컬 저장소 브랜치 생성하기 (Local Folder) -> git branch 브랜치이름 - -## 2. 원격 저장소 브랜치 생성하기 (GitHub) -> git push origin ##1.에서생성한 브랜치이름 - ---- - -# Branch Read - -## 1. 브랜치 확인하기 -> git branch - -## 2. 브랜치 변경하기 (해당 브랜치이름으로 브랜치 변경) -> git checkout 브랜치이름 - ---- - -# Branch Delete - -## 1. 로컬 저장소 브랜치 제거하기 (Local Folder) -> git branch -d 브랜치이름 - -## 2. 원격 저장소 브랜치 제거하기 (GitHub) -> git push origin :브랜치이름 - ---- - -# Branch Update - -> 브랜치 이름 변경 방법은, 변경하고싶은 이름의 브랜치를 생성한 후, 기존 브랜치를 제거하는 것이다. - - -## 1. 로컬 저장소 브랜치 이름 변경 (Local Folder) -> git branch -m 기존브랜치이름 변경브랜치이름 - - -## 2. 원격 저장소 브랜치 생성 (GitHub) -> git push origin 변경브랜치이름 - -## 3. 원격 저장소 기존 브랜치 제거 (GitHub) -> git push origin :기존브랜치이름 변경브랜치이름 diff --git a/_posts/2022-07-25-Hibernate.md b/_posts/2022-07-25-Hibernate.md deleted file mode 100644 index 65475ebe..00000000 --- a/_posts/2022-07-25-Hibernate.md +++ /dev/null @@ -1,78 +0,0 @@ ---- - -title: Hibernate 란 무엇일까? - -date: 2022-07-25 -categories: [Spring, Hibernate] -tags: [Hibernate] -layout: post -toc: true -math: true -mermaid: true - ---- - -# Hibernate 를 알아보기 전에 - -## JPA란 (Java Persistence API) 무엇인가 부터 알아보자 - -JPA : Java ORM 기술에 대한 API 표준 명세를 말한다. - -즉, JPA는 인터페이스 라고 생각하면된다. - -이때 JPA를 사용하다 보면 Hibernate를 많이 사용하게 되는데 Hibernate는 JPA의 구현체이다. - -Hibernate 이외에도 DataNucleus, EclipseLink 등 다양한 JPA 구현체가 존재한다. - ---- - -# Hibernate 를 알아보자 - -[Hibernate 공식 유저 가이드](https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html) - -위 링크를 참고했다. - -`@Entity` `@Id` `@GeneratedValue` - -예시로, 위와 같은 객체와 DB를 매핑시키기 위한 어노테이션들을 자주 접했을 것이다. - -이것들 모두 JPA라는 인터페이스에 명시가 되어있는 것이고, 이 명시된 사항을 구현한 것이 Hibernate 이다. - ---- - -# Hibernate 와 JPA - -![image](https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/images/architecture/data_access_layers.svg) - -위 그림은, **Java 코드로 작성된 객체 기반의 내용**이 **어떻게 DB와 소통을 하는 것 인지**를 나타내준다. - -사용자는 **JPA라는 인터페이스**의 내용을 통해 DB에 접근하는 코드를 작성한다. - -JPA 는 그 **인터페이스를 구현한 여러 구현체 중 Hibernate** 를 사용한다. - -**Hibernate 는 사용자의 부름에 응하여** **미리 구현해둔 JPA 내용을 토대로**, **JDBC 를 이용한 DB와의 소통을 하며** **원하는 결과를 가져다 주는 역할**을 해준다. - ---- - -# JPA 가 요구하는(명시하는, JPA라는 인터페이스가 담고있는) 내용의 다이어그램 - -![image](https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/images/architecture/JPA_Hibernate.svg) - -### Session Factory - -Thread-Safe 한 표현 방법으로, 애플리케이션 도메인과 DB 모델간의 매핑을 해주는 표현 방법을 제공한다. - -Hibernate.Session Acts as a factory for org.hibernate.Session instances. - -The EntityManagerFactory is the JPA equivalent of a SessionFactory and basically, those two converge into the same SessionFactory implementation. - - ---- - -# 결론 - -우리가 자주 접하는 **JPA를 사용하는 과정**에서, - -**JPA 는 우리에게 노예가 어떤 일을 할 수 있는 지를 적어놓은 것**이다. - -실제로 **그 일을 수행하는 것은 Hibernate라는 노예가 열심히 만들어놓은 것**을 **이용**하게 되는 것이다. diff --git a/_posts/2022-07-25-JDBC.md b/_posts/2022-07-25-JDBC.md deleted file mode 100644 index b8b966a5..00000000 --- a/_posts/2022-07-25-JDBC.md +++ /dev/null @@ -1,81 +0,0 @@ ---- - -title: JDBC 란 무엇일까? - -date: 2022-07-25 -categories: [Java, JDBC] -tags: [JDBC] -layout: post -toc: true -math: true -mermaid: true - ---- - -# JDBC 란! - -Java DataBase Connectivity 의 줄임말이다. - -즉, Database 에 연결하고 쿼리를 수행하는 API 중 하나이다. - -또한 JDBC는 **적합한 드라이버가 제공**된다면 **모든 데이터베이스**에서 작동할 수 있다. - ---- - -# JDBC Driver 란! - -JDBC API 구현체로, 각각의 다른 타입을 가진 Database를 연결할 때 사용하는 것이다. - -## JDBC Driver 종류는? - -Type 1 : 다른 데이터베이스 접근 API (ODBC 등)에 대한 매핑을 시킬 수 있다. - -Type 2 : 대상 데이트베이스의 클라이언트 측 라이브러리를 사용하는 구현체이다. - -Type 3 : 미들웨어를 사용하여 JDBC 호출을 특정 데이터베이스 호출로 변환한다. Network Protocol Driver 로 주로 쓰인다. - -Type 4 : JDBC 호출을 특정 데이트베이스 호출로 변환하여 직접 데이터베이스에 연결한다. Database Protocol divers 로 주로 쓰인다. - ---- - -# JDBC Driver 사용하기 - -[JDBC-공식문서](https://docs.oracle.com/javase/tutorial/jdbc/basics/connecting.html) - -```java -public Connection getConnection() throws SQLException { - - Connection conn = null; - Properties connectionProps = new Properties(); - connectionProps.put("user", this.userName); - connectionProps.put("password", this.password); - - if (this.dbms.equals("mysql")) { - conn = DriverManager.getConnection( - "jdbc:" + this.dbms + "://" + - this.serverName + - ":" + this.portNumber + "/", - connectionProps); - } else if (this.dbms.equals("derby")) { - conn = DriverManager.getConnection("jdbc:" + this.dbms + ":" + - this.dbName + - ";create=true", - connectionProps); - } - System.out.println("Connected to database"); - return conn; - } -``` - - -위 코드의 내용을 활용하여 Java 코드를 통해 Database를 접속할 수 있게 된다. - -Spring Framework를 사용하면, Hibernate가 대신 JDBC 를 활용하여 DB와의 소통을 시작하게 해준다. - ---- - -# 결론 - -Java 기반의 Framework 혹은, 순수 Java 코드로 DB에 접근하여 소통을 위해선 JDBC 를 활용해야하고, - -가장 **DB와 Layer 가 가까운 기술**이라고 볼 수 있다. diff --git a/_posts/2022-07-25-ORM.md b/_posts/2022-07-25-ORM.md deleted file mode 100644 index a7d95876..00000000 --- a/_posts/2022-07-25-ORM.md +++ /dev/null @@ -1,76 +0,0 @@ ---- - -title: ORM 이란 무엇일까? - -date: 2022-07-25 -categories: [Spring, ORM] -tags: [ORM] -layout: post -toc: true -math: true -mermaid: true - ---- - -# ORM 이란? - -요즘 같은 세상에 실제 상용 애플리케이션을 구현하려면 데이터베이스는 필수이다. - -그런데 우리는 Java와 Spring을 사용하는 개발자다. - -SQL을 어느정도 알지만 잘 알지는 못해서 이것저것 다루다보면 너무 버겁다.. - -그렇기 때문에 내가 주로 쓰는 언어로 데이터베이스를 다룰 수 있으면 엄청 편하겠지? - -게다가 Java의 특징인 객체지향을 녹여낼 수 있다면? - -위와 같은 역할을 해주는 것이 ORM(Object Relational Mapping)이다. - -ORM 을 활용하면 데이터베이스에 데이터를 넣고, 읽고, 수정하고, 삭제 할때 SQL을 작성하지 않아도 된다. - -Spring 에서는 JPA 를 구현한 RedHat에서 제작한, Hibernate가 주로 쓰인다. - ---- - -# 내가 익숙한 코드로 DB까지 다룬다면,, ORM 의 단점이 있을까? - -### 난이도 - 단점이자 장점 - -ORM 을 제대로 쓰려면, 해당 플랫폼에 대한 ORM을 제대로 공부해야한다. - -그치만 어렵다. 시간이 많이 소요될 것이고 어설프게 썼다간 이도저도 아니게 될 수도 있다. - -또한 MySQL 과 같은 매핑 시키고자하는 RDBMS 를 알긴 해야한다. DB가 어떻게 동작하는지 모른다면 - -ORM을 정확하게 활용할 수 있는 방법을 알지 못하게 된다. - -### 복잡성 - 단점이자 장점 - -데이터베이스 내용과 객체지향 코드가 일치하지 않아 추가적인 작업을 해줘야 할 필요도 생긴다. - -이로인해 코드의 복잡도가 증가하게 된다. - -또한 ORM 내부 동작에 의한 성능 문제가 발생할 수 있다. - ---- - -# 그럼에도 불구하고 쓸 수 밖에없는 이유 - -### 난이도 - 장점이자 단점 -Java 언어 환경에서, 순수 MySQL Query 혹은 순수 JDBC 코드로 작성하여 DB 와 소통하는 것 보다 - -ORM의 도움을 받는게 훨씬 쉽다. - -### 복잡성 - 장점이자 단점 -위에서 언급한 원시적인 방법에 비해, 복잡한 프로세스를 숨기고 상위 구현수준에서 다루기 때문에 간결하다. - - ---- - -# 결론 - -ORM 되도록이면 쓰자 어지간한 SQL Injection 도 방어해주는 보안적인 측면도 좋고 - -단점으로 인한 영향을 장점이 덮어줄만큼 생산성이 뛰어나다. - -대신, 확실하게 해당 ORM 에 관하여 공부하고 사용하자! diff --git a/_posts/2022-08-09-Java8StreamLambda.md b/_posts/2022-08-09-Java8StreamLambda.md index 00a83a96..156a1809 100644 --- a/_posts/2022-08-09-Java8StreamLambda.md +++ b/_posts/2022-08-09-Java8StreamLambda.md @@ -216,15 +216,11 @@ Stream에서 지원하는 문법은 굉장히 많다. 다 외워서 사용할 for(int i=0; i < e; i++) if(a[i] > m) m = a[i]; -
- ### Stream을 이용한 배열 접근 후 최댓값 도출 int m = Arrays.stream(ints) .reduce(Integer.MIN_VALUE, Math::max); -
- > 두 코드를 동작시킨 환경에서의 성능차이는 다음과 같다. int-array, for-loop : 0.36 ms @@ -232,12 +228,8 @@ int-array, for-loop : 0.36 ms int-array, seq. stream: 5.35 ms -
- 단편적인 예시이긴 하지만 **일반 배열이 아닌** **ArrayList 에서도 반복문이 더 우세한 결과**를 가지고 있었다. -
- https://pamyferret.tistory.com/49 또한 위 블로그에 따르면 @@ -256,8 +248,7 @@ For-loop이 더 빠른 이유를 설명해놓았는데 #### - stream의 경우 신생(?)인 만큼 정보가 없어 for문과 같은 정교한 최적화를 수행할 수 없다. -
-이 두가지 근거(?)가 설득력 있게 다가왔다. +이 두가지 근거가 설득력 있게 다가왔다. --- diff --git a/_posts/2023-01-01-Algorithm.md b/_posts/2023-01-01-Algorithm.md deleted file mode 100644 index 1192c48a..00000000 --- a/_posts/2023-01-01-Algorithm.md +++ /dev/null @@ -1,64 +0,0 @@ ---- - -title: Algorithm -date: 2023-01-01 -categories: [Algorithm] -tags: [Algorithm] -layout: post -toc: true -math: true -mermaid: true - ---- - -# Java 지원 자료형 - -## List - -| 연산 | ArrayList | LinkedList | -|---------|----------------------------|--------------------| -| 끝에 삽입 | O(1), O(N)[리스트 크기를 늘려야할 때] | O(1) | -| 중간에 삽입 | O(N) | O(N)[탐색], O(1)[삭제] | -| 끝에서 삭제 | O(1) | O(1) | -| 중간에서 삭제 | O(N) | O(N)[탐색], O(1)[삭제] | -| 조회 | O(1) | O(N) | - -### ArrayList - -동적 배열이다. - -### LinkedList - -이중 연결 리스트(Head, Tail을 가짐)이다. - ---- - -## Map - -모든 구현체의 연산의 시간 복잡도가 O(1)이다. - -### HashMap (기본 Map) - -Key-Value를 가지는 일반적인 Map이다. 순서를 보장하지 않는다. - -### LinkedHashMap (순서 보장 Map) - -Key-Value를 가지는 Map이다. 순서를 보장한다. - -### TreeMap (특정 조건에 따른 정렬 Map) - -값에 따라 순서를 정렬한다. 내부적으로 `Red-Black Tree`로 구현되어있고 정렬 순서를 임의로 지정할 수 있다. - ---- - -## 크고 정밀한 숫자를 위한 자료형 - -### BigInteger - -무한대의 숫자를 표기할 수 있다. 이로 인해 정밀한 수까지도 표현이 가능한 자료형이다. - -모든 숫자를 이 자료형을 사용하게되면 성능 저하가 있으니 꼭 필요시 사용해야한다. - -`add()`, `subtract()`, `multiply()`, `divide()`, `remainder()` - ---- diff --git a/_posts/2023-01-01-SHORTS-1.md b/_posts/2023-01-01-SHORTS-1.md index 4408f912..b269ca31 100644 --- a/_posts/2023-01-01-SHORTS-1.md +++ b/_posts/2023-01-01-SHORTS-1.md @@ -1,6 +1,6 @@ --- -title: SHORTS - 네이버 뉴스 크롤러 제작 과정 +title: 네이버 뉴스 크롤러 제작 과정 date: 2023-01-01 categories: [SHORTS] tags: [SHORTS] diff --git a/_posts/2023-01-01-SHORTS-2.md b/_posts/2023-01-01-SHORTS-2.md index 73bd8d20..d9c63ecc 100644 --- a/_posts/2023-01-01-SHORTS-2.md +++ b/_posts/2023-01-01-SHORTS-2.md @@ -1,6 +1,6 @@ --- -title: SHORTS - 크롤링한 뉴스의 키워드 추출 과정 +title: 뉴스 기사 본문에 관한 키워드 추출 로직 구현 과정 date: 2023-01-01 categories: [SHORTS] tags: [SHORTS] diff --git a/_posts/2023-01-01-SHORTS-3.md b/_posts/2023-01-01-SHORTS-3.md index 96bc09b8..5f9ae3c6 100644 --- a/_posts/2023-01-01-SHORTS-3.md +++ b/_posts/2023-01-01-SHORTS-3.md @@ -1,6 +1,6 @@ --- -title: SHORTS - AOP를 활용하여 사용자 인증/인가 로직 간소화 +title: AOP를 활용하여 사용자 인증/인가 로직 간소화 date: 2023-01-01 categories: [SHORTS] tags: [SHORTS] diff --git a/_posts/2023-01-01-SHORTS-4.md b/_posts/2023-01-01-SHORTS-4.md index 161429ce..8665e132 100644 --- a/_posts/2023-01-01-SHORTS-4.md +++ b/_posts/2023-01-01-SHORTS-4.md @@ -1,6 +1,6 @@ --- -title: SHORTS - 인덱스를 활용한 150만건이 담긴 데이터베이스 내 BETWEEN 조건 질의시 성능 개선 +title: 인덱스를 활용한 150만건이 담긴 데이터베이스 내 BETWEEN 조건 질의시 성능 개선 date: 2023-01-01 categories: [SHORTS] tags: [SHORTS] diff --git a/_posts/2023-01-01-SUGO-2.md b/_posts/2023-01-01-SUGO-2.md deleted file mode 100644 index 574c69cb..00000000 --- a/_posts/2023-01-01-SUGO-2.md +++ /dev/null @@ -1,15 +0,0 @@ ---- - -title: SUGO - S3에 정적 컨텐츠 업로드 -date: 2023-01-01 -categories: [SUGO] -tags: [SUGO] -layout: post -toc: true -math: true -mermaid: true - ---- - -# S3에 정적 컨텐츠 업로드 - diff --git a/_posts/2023-01-01-SUWIKI-1.md b/_posts/2023-01-01-SUWIKI-1.md index aeb4d5ea..ce691462 100644 --- a/_posts/2023-01-01-SUWIKI-1.md +++ b/_posts/2023-01-01-SUWIKI-1.md @@ -1,6 +1,6 @@ --- -title: SUWIKI - 비관적 락을 활용한 동시성 문제 해결 +title: 비관적 락을 활용한 동시성 문제 해결 date: 2023-01-01 categories: [SUWIKI] tags: [SUWIKI] diff --git a/_posts/2023-01-01-SUWIKI-2.md b/_posts/2023-01-01-SUWIKI-2.md index 2009b7a1..28c0df05 100644 --- a/_posts/2023-01-01-SUWIKI-2.md +++ b/_posts/2023-01-01-SUWIKI-2.md @@ -1,6 +1,6 @@ --- -title: SUWIKI - 사용자 인증 방식에 대한 비교 및 구현 +title: 사용자 인증 방식에 대한 비교 및 구현 date: 2023-01-01 categories: [SUWIKI] tags: [SUWIKI] diff --git a/_posts/2023-01-01-SUWIKI-3.md b/_posts/2023-01-01-SUWIKI-3.md index bede4571..9edbcc8e 100644 --- a/_posts/2023-01-01-SUWIKI-3.md +++ b/_posts/2023-01-01-SUWIKI-3.md @@ -1,6 +1,6 @@ --- -title: SUWIKI - 운영 중인 프로덕션의 테스트 환경을 개선, 테스트 대역을 코드로 살펴보기 +title: 운영 중인 프로덕션의 테스트 환경을 개선, 테스트 대역을 코드로 살펴보기 date: 2023-01-01 categories: [SUWIKI] tags: [SUWIKI] diff --git a/_posts/2023-01-01-SUWIKI-4.md b/_posts/2023-01-01-SUWIKI-4.md index 49e5fbb0..420eac0a 100644 --- a/_posts/2023-01-01-SUWIKI-4.md +++ b/_posts/2023-01-01-SUWIKI-4.md @@ -1,6 +1,6 @@ --- -title: SUWIKI - Caffeine Cache를 활용하여 홈 API 응답시간 개선 +title: Caffeine Cache를 활용하여 홈 API 응답시간 개선 date: 2023-01-01 categories: [SUWIKI] tags: [SUWIKI] diff --git a/_posts/2023-01-24-FactsandMisconceptionsofObjectOrientation.md b/_posts/2023-01-24-FactsandMisconceptionsofObjectOrientation.md deleted file mode 100644 index a228473a..00000000 --- a/_posts/2023-01-24-FactsandMisconceptionsofObjectOrientation.md +++ /dev/null @@ -1,83 +0,0 @@ ---- - -title: 객체지향의 사실과 오해 - 역할, 책임, 협력 - -date: 2023-01-24 -categories: [OOP] -tags: [OOP] -layout: post -toc: true -math: true -mermaid: true - ---- - -# 상황 예시 : 카페 - -## 커피 주문을 위해 협력하는 사람들 - -**역할**이라는 단어는 **책임** 이라는 개념을 내포한다. - -프로그래머라는 역할에도 훌륭한 프로그램을 개발할 책임이 내포되어있다. - -따라서 특정한 **역할**은 특정한 **책임**을 암시한다. - -| 역할 | 책임 | -|------|------------------------------------| -| 손님 | 커피 주문 | -| 캐셔 | 주문 내용을 바리스타에게 전달, 커피가 완성됨을 손님에게 알림 | -| 바리스타 | 커피 제조 | - -역할과 책임은 협력을 원활하게 진행되는 데 필요한 핵심적인 구성 요소이다. - -### 여러 사람들이 동일한 역할을 수행할 수 있다. - -손님 입장에서 어떤 캐셔가 주문을 받는지는 중요하지 않다. - -### 역할은 대체 가능성이다. - -손님 입장에서 캐셔는 대체 가능하다. 두 명의 캐셔 중 아무나한테 요청해도 응답을 받을 수 있다. - -### 책임을 수행하는 방법은 자율적으로 선택한다. - -요청을 받은 사람들은 요청을 처리하는 방법을 자유롭게 선택한다. - -캐셔 A는 바리스타에게 주문표만 던지는 식으로 요청할 수 도 있고 - -캐셔 B는 바리스에게 직접 주문을 말해주는 식으로 요청할 수 있는 것이다. - -### 한 사람이 동시에 여러 역할을 수행할 수 있다. - -캐셔와 바리스타 라는 역할을 동시에 할 수도 있다. - -## 역할, 책임, 협력 - -사람들은 커피 주문처럼 특정 목표를 이루기 위해 서로 협력한다. - -협력의 핵심은 특정한 책임을 수행하는 역할들 간의 연쇄적인 요청과 응답을 통해 목표를 달성하는 것이다. - -**객체지향**은 **적절한 객체**에게 **적절한 책임**을 **할당**하는 것으로 시작한다. - -# 객체 - -객체는 애플리케이션의 기능을 구현하기 위해 존재한다. - -객체는 충분히 협력적이여야한다. 다른 객체의 요청와의 요청/응답을 성실히 수행해야한다. 스스로 모든 것을 해결하려는 객체는 좋지 않다. - -객체는 충부히 자율적이여야한다. 어떤 요청/응답에 대하여 스스로 결정하여 처리할 수 있어야 한다는 것이다. - -# 메세지 - -객체는 협력을 위해 다른 객체에게 메시지를 전송하고 다른 객체로부터 메시지를 수신한다. - -수신 객체는 메시지를 이해할 수 있는지 여부를 판단하고, 자신만의 자율적인 방법에 따라 메시지를 처리한다. - -이때 메시지를 처리하는 방법을 **메서드** 라고한다. - -# 객체지향의 본질 - -클래스의 구조와 메서드가 아니라 - -객체의 역할, 책임, 협력에 집중해야한다. - -객체지향은 클래스를 지향하는 것이 아니다. JavaScript는 클래스와 상속 없이 객체간의 협력관계를 만들 수 있다. diff --git a/_posts/2023-1-1-Spring.md b/_posts/2023-1-1-Spring.md deleted file mode 100644 index 17e39816..00000000 --- a/_posts/2023-1-1-Spring.md +++ /dev/null @@ -1,131 +0,0 @@ ---- - -title: Fundermental of Spring -date: 2023-01-01 -categories: [Spring] -tags: [Spring] -layout: post -toc: true -math: true -mermaid: true - ---- - -# 스프링 프레임워크란? - -# 프레임워크와 라이브러리와 차이는? - -# 스프링의 특징 - -- 경량 컨테이너 -- POJO(Plain Old Java Object) -- 제어 역행(IoC, Inversion of Control) - - 코드의 유연성, 테스트 용이성, 모듈화, 재사용성, 확장성, 가독성, 유지보수성 등 여러 가지 장점 -- 의존성 주입(DI, Dependency Injection) - - 생성자 주입 - - 한 번 주입되면 변경할 수 없다. 값이 누락된 경우 컴파일 오류가 발생해서 IDE로 어디서 문제가 발생했는지 확인할 수 있는 장점이 있다. - - 순환참조 방지, final, 테스트 코드 작성 용이 - - 수정자 주입 - - public 으로 열려 있어서 잘못 변경되면서 에러가 발생할 수 있다. - - 변경이 필요하면 쓴다 - - 필드 주입 -- 트랜잭션 관리 -- AOP 지원 - - 스프링은 관점 지향 프로그래밍(Aspect-Oriented Programming, AOP)을 지원하고, 공통 관심 사항(예: 로깅, 보안)을 분리하여 모듈화(횡단 관심사 분리) -- 테스트 지원 - ---- - -# Spring 최신버전 주요 Features -- Spring 5 - - Java 8 기본 설정 - - @Nullable, @NotNull 추가로 컴파일 타임에 유효성 검사 가능 - - classpath 기반 component scan 가능 - - Webflux Stack 추가 - ---- - -# Spring vs Spring Boot - -- Embbeded Tomcat 여부, jar 로 배포 가능 - - @AutoConfiguration - - 일반적으로 수많은 Bean들을 자동으로 등록해주는 기능 - - 애플리케이션의 설정과 빈 등록을 자동화하여 개발자가 최소한의 설정을 제공하면서도 애플리케이션을 빠르게 구축할 수 있게 해주는 역할 - ---- - -# Bean이란? - ---- - -# Bean의 생명 주기 - ---- - -# filter와 intercepter 차이 - ---- - -# Dispatcher-Servlet 이란 - ---- - -# 스프링 어노테이션 이란? - -스프링 어노테이션은 Java 어노테이션의 확장으로, 스프링 애플리케이션을 구성하고 제어하기 위한 메타데이터를 제공하며, XML 설정 파일을 대체하거나 보완 -- @ComponentScan: 스프링이 컴포넌트 스캔을 수행하도록 지정하는 어노테이션으로, 지정된 패키지나 클래스를 대상으로 스캔을 수행하고 @Component 및 관련 어노테이션을 찾아 빈으로 등록합니다. - - -# AOP란? - -객체 지향 프로그래밍 패러다임을 보완하는 기술로 메소드나 객체의 기능을 핵심 관심사(Core Concern)와 공통 관심사(Cross-cutting Concern)로 나누어 프로그래밍하는 것 - -## 프록시 패턴 - -- JDK Proxy : Java 내부에 구현되어있는 Proxy - -- CGLLIB Proxy : Open source로 구현되어있는 Proxy - - 내부 호출시 프록시가 적용되지 않는 이슈 - - 자기자신 주입 - - 지연 조회 - - ObjectProvider 를 사용하여 조회한다. - - ApplicationContext 를 통해 조회한다. - - 구조 개선 - ---- - -# Maven/Gradle - -- 빌드 관리 도구 - - 종속성 다운로드 - 전처리(Preprocessing) - - 소스코드를 바이너리 코드로 컴파일(Compile) - - 바이너리 코드를 패키징(Packaging) - - 테스트 실행(Testing) - - 프로덕션 시스템에 배포(distribution) - -- maven - - xml사용 - - 라이프 사이클에 의해 동작 - - clean -> validate -> compile -> test ... - -- gradle - - apache ant + Groovy - - 가독성이 좋다 - - 재사용에 용이 - - 구조적인 장점 - - 편리함 - - 멀티 프로젝트 지원 - - gradle 궁극적인 사용 이유 - - Maven은 멀티 프로젝트에서 특정 설정을 다른 모듈에서 사용하려면 상속 받아야하지만, gradle은 설정 주입 방식을 사용하므로 멀티 프로젝트에 적합하다. - - 캐시적용으로 인해 빌드 속도 향상 - ---- - -# JPA - -- JPA를 왜 쓰는지 - -- JPA를 사용할 때의 주의할 점 및 장/단점 - -- 영속성 컨텍스트 - diff --git a/_posts/2023-10-01-Revenge.md b/_posts/2023-10-01-Revenge.md deleted file mode 100644 index 7499daff..00000000 --- a/_posts/2023-10-01-Revenge.md +++ /dev/null @@ -1,92 +0,0 @@ ---- - -title: 기본이 중요하다 -date: 2023-10-01 -categories: [Java, Kotlin, SpringBoot, JPA, QueryDSL, MySQL, Lock, Index, Cache, Async, Test, Authorization] -tags: [Java, Kotlin, SpringBoot, JPA, QueryDSL, MySQL, Index, Cache, Test, Authorization] -layout: post -toc: true -math: true -mermaid: true - ---- - -# SUWIKI - -## 1. 운영 중 발생한 동시성 문제를 해결한 과정 - -[해결 과정](https://k-diger.github.io/posts/SUWIKI-1) - -## 2. 토큰 기반 인증 vs 세션 기반 인증을 선택한 과정 - -[해결 과정](https://k-diger.github.io/posts/SUWIKI-2) - -## 3. 테스트 환경 개선, 테스트 대역을 코드로 알아보기 - -[해결 과정](https://k-diger.github.io/posts/SUWIKI-3) - -## 4. Caffeine Cache를 도입한 이유와 결과 - -[해결 과정](https://k-diger.github.io/posts/SUWIKI-4) - ---- - -# SUGO - -## 1. @Async 애노테이션과 비동기 처리 시 주의점 - -[해결 과정](https://k-diger.github.io/posts/SUGO-1) - -## 2. S3에 정적 컨텐츠 업로드 구현 - -## 3. QueryProjection을 활용하여 N + 1 문제 예방으로 조회 성능 최적화 - -- N+1 문제가 발생하는 이유 -- N+1 문제를 해결하는 다른 방법들 -- Fetch Join사용 시 주의할 점 - -## 4. Spring Security를 활용하여 사용자 인증/인가 프로세스 개선 - ---- - -# SHORTS - -## 1. 크롤러 구현, 크롤러 운영 중 발생한 문제 해결 (운영 중 발생한 OOM, DB 커넥션 부족 문제) - -[해결 과정](https://k-diger.github.io/posts/SHORTS-1) - -## 1.2 위 문제 해결을 위한 JVM의 구조와 GC의 동작 원리 - -![JVM: Architecture](https://techvidvan.com/tutorials/wp-content/uploads/sites/2/2020/06/JVM-Model.jpg) - -- [ClassLoader](https://k-diger.github.io/posts/ClassLoader) -- [Memory](https://k-diger.github.io/posts/JVM-Memory) -- [Execution Engine](https://k-diger.github.io/posts/Execution-Engine) -- [JIT Compiler](https://k-diger.github.io/posts/JITCompiler) -- [Garbage Collector](https://k-diger.github.io/posts/JVM-GC) - -## 2. 키워드 추출 로직 구현 과정 - -[해결 과정](https://k-diger.github.io/posts/SHORTS-2) - -## 3. AOP를 활용하여 사용자 인증/인가 로직 간소화 - -[해결 과정](https://k-diger.github.io/posts/SHORTS-3) - -## 4. 150만건이 담긴 테이블 BETWEEN 조건 질의시 성능 개선 과정 - -[해결 과정](https://k-diger.github.io/posts/SHORTS-4) - ---- - -# 기본이 중요하다 - Operating System - -[운영체제 모음집](https://k-diger.github.io/posts/OperatingSystem) - ---- - -# 기본이 중요하다 - Network - -[네트워크 모음집](https://k-diger.github.io/posts/OperatingSystem) - ---- diff --git a/_posts/2024-08-08-Archive.md b/_posts/2024-08-08-Archive.md new file mode 100644 index 00000000..e2a20943 --- /dev/null +++ b/_posts/2024-08-08-Archive.md @@ -0,0 +1,94 @@ +--- + +title: 기본이 중요하다 +date: 2024-08-08 +categories: [Java, Kotlin, SpringBoot, JPA, QueryDSL, MySQL, Lock, Index, Cache, Async, Test, Authorization] +tags: [Java, Kotlin, SpringBoot, JPA, QueryDSL, MySQL, Index, Cache, Test, Authorization] +layout: post +toc: true +math: true +mermaid: true + +--- + +# 기본이 중요하다 - 자료구조 + +- [자료구조](https://k-diger.github.io/posts/) + +--- + +# 기본이 중요하다 - 운영체제 + +- [운영체제](https://k-diger.github.io/posts/OperatingSystem) + +--- + +# 기본이 중요하다 - 네트워크 + +- [네트워크](https://k-diger.github.io/posts/Network) + +--- + +# 기본이 중요하다 - DBMS + +- [RDBMS](https://k-diger.github.io/posts/) + +--- + +# 기본이 중요하다 - Java/Kotlin + +- [네트워크 모음집](https://k-diger.github.io/posts/Langauge) + +--- + +# 기본이 중요하다 - Spring + +- [Reflection/DynamicProxy/CGLIB/AOP](https://k-diger.github.io/posts/Reflection-DynamicProxy-CGLIB-AOP.md) + +--- + +# SUWIKI + +## 1. 갱신 손실 문제 해결 + +- [해결 과정](https://k-diger.github.io/posts/SUWIKI-1) + +## 2. 토큰 기반 인증 vs 세션 기반 인증 + +[해결 과정](https://k-diger.github.io/posts/SUWIKI-2) + +## 3. 테스트 환경 개선, 테스트 대역을 코드로 알아보기 + +[해결 과정](https://k-diger.github.io/posts/SUWIKI-3) + +## 4. Caffeine Cache를 도입한 이유와 결과 + +[해결 과정](https://k-diger.github.io/posts/SUWIKI-4) + +--- + +# SUGO + +## 1. @Async 애노테이션과 비동기 처리 시 주의점 + +[해결 과정](https://k-diger.github.io/posts/SUGO-1) + +# SHORTS + +## 1. 크롤러 구현, 크롤러 운영 중 발생한 문제 해결 (운영 중 발생한 OOM, DB 커넥션 부족 문제) + +[해결 과정](https://k-diger.github.io/posts/SHORTS-1) + +## 2. 키워드 추출 로직 구현 과정 (Lucene) + +[해결 과정](https://k-diger.github.io/posts/SHORTS-2) + +## 3. AOP를 활용하여 사용자 인증/인가 로직 간소화 + +[해결 과정](https://k-diger.github.io/posts/SHORTS-3) + +## 4. 150만건이 담긴 테이블 BETWEEN 조건 질의시 성능 개선 과정 (Index) + +[해결 과정](https://k-diger.github.io/posts/SHORTS-4) + +---