diff --git a/_includes/nav_list_main b/_includes/nav_list_main
index e7b9407..0318802 100644
--- a/_includes/nav_list_main
+++ b/_includes/nav_list_main
@@ -265,6 +265,15 @@
+
+ {% for category in site.categories %}
+ {% if category[0] == "AOP" %}
+ - AOP ({{category[1].size}})
+ {% endif %}
+ {% endfor %}
+
+
+
{% for category in site.categories %}
{% if category[0] == "Test" %}
diff --git a/_pages/categories/category-AOP.md b/_pages/categories/category-AOP.md
new file mode 100644
index 0000000..4bec008
--- /dev/null
+++ b/_pages/categories/category-AOP.md
@@ -0,0 +1,10 @@
+---
+title: "AOP"
+layout: archive
+permalink: categories/AOP
+author_profile: true
+sidebar_main: true
+---
+
+{% assign posts = site.categories['AOP'] %}
+{% for post in posts %} {% include archive-single.html type=page.entries_layout %} {% endfor %}
diff --git "a/_posts/2023-09-17-Spring-SpringMVC \352\265\254\355\230\204.md" "b/_posts/2023-09-17-Spring-SpringMVC \352\265\254\355\230\204.md"
index e225f21..6269f9a 100644
--- "a/_posts/2023-09-17-Spring-SpringMVC \352\265\254\355\230\204.md"
+++ "b/_posts/2023-09-17-Spring-SpringMVC \352\265\254\355\230\204.md"
@@ -100,6 +100,8 @@ public class SampleConfiguration {
- Web설정
```java
+@EnableWebMvc
+@ComponentScan(basePackages = "<패키지명>")
public class SampleConfiguration implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
diff --git a/_posts/2023-09-19-Nodejs-npm.md b/_posts/2023-09-19-Nodejs-npm.md
index e8de47d..47808e2 100644
--- a/_posts/2023-09-19-Nodejs-npm.md
+++ b/_posts/2023-09-19-Nodejs-npm.md
@@ -18,9 +18,10 @@ last_modified_at: 2023-09-19T08:00:00-10:00:00
# 내용
-## npm이란?
-- Node Package Manager
-- node.js의 자동화된 의존성과 패키지 관리를 위한 패키지 매니저
+## 정의
+> npm이란?
+> Node Package Manager
+> node.js의 자동화된 의존성과 패키지 관리를 위한 패키지 매니저
## 역할
- 라이브러리 다운
diff --git a/_posts/2023-10-10-Nodejs-npx.md b/_posts/2023-10-10-Nodejs-npx.md
index 4199f75..c9ce2c1 100644
--- a/_posts/2023-10-10-Nodejs-npx.md
+++ b/_posts/2023-10-10-Nodejs-npx.md
@@ -18,8 +18,9 @@ last_modified_at: 2023-10-10T08:00:00-10:00:00
# 내용
-## npx 란
-- npm 패키지를 설치하지 않고 사용할 수 있게 해주는 도구
+## 정의
+> npx 란
+> npm 패키지를 설치하지 않고 사용할 수 있게 해주는 도구
## 역할
- 프로젝트에 추가하거나 전역 패키지로 추가하지 않고, npm을 바로 실행 할 수 있음
diff --git "a/_posts/2023-10-16-Git-Git-Private-Sourcetree\354\227\260\353\217\231.md" "b/_posts/2023-10-16-Git-Git-Private-Sourcetree\354\227\260\353\217\231.md"
index 7512a5d..933d79b 100644
--- "a/_posts/2023-10-16-Git-Git-Private-Sourcetree\354\227\260\353\217\231.md"
+++ "b/_posts/2023-10-16-Git-Git-Private-Sourcetree\354\227\260\353\217\231.md"
@@ -21,7 +21,10 @@ last_modified_at: 2023-10-16T08:00:00-10:00:00
## SSH key 생성
- [key 생성방법](../../통신/통신-SSH#git을-사용한--키-생성)
-## Git Repository에 Public Key 등록
+## Public Key 등록
+
+### Repository에 등록하는법
+- **특정 Repository에 대한 권한만 획득하려면 Repository에 Deploy Key를 등록한다.**
- Repository의 settings 탭에 Add deploy key 항목을 선택한다
![image](../../assets/images/GitRepositoryAddSSHKeyMenu.png)
@@ -34,6 +37,13 @@ last_modified_at: 2023-10-16T08:00:00-10:00:00
![image](../../assets/images/GitSSHKeyAddResult.png){: width=500 height=500}
+### Git 계정에 등록하는법
+- **계정에 귀속된 모든 Repository에 대한 권한을 획득하려면 계정 SSH키 설정에 키를 등록한다.**
+
+![image](../../assets/images/GitUserSetting.png)
+
+![image](../../assets/images/GitUserAddSSHKey.png)
+
## SourceTree에 Public Key 등록
- 소스트리의 도구-옵션 팝업창에 SSH 키를 등록하는 항목이 있다.
diff --git a/_posts/2023-10-17-CLI-Window-Command-Detail.md b/_posts/2023-10-17-CLI-Window-Command-Detail.md
index dbd5328..6a8eaf3 100644
--- a/_posts/2023-10-17-CLI-Window-Command-Detail.md
+++ b/_posts/2023-10-17-CLI-Window-Command-Detail.md
@@ -98,6 +98,22 @@ tasklist /V
#### sc delete \<서비스명\>
- **관리자 콘솔로만 사용 가능**
+### tree
+- 파일 및 폴더 구조를 tree형태로 표현
+
+#### 옵션
+
+| 옵션명 | 설명 |
+| ------ | -------------------------------------- |
+| /f | 각 폴더에 있는 파일 이름을 화면에 표시 |
+| /a | 그래픽 문자 대신 텍스트 문자를 사용 |
+
+```bash
+tree <경로> /f /a
+```
+
+![image](../../assets/images/TreeResult.png)
+
---
# 연결문서
diff --git "a/_posts/2023-10-18-\355\225\240\354\235\274-\352\262\200\354\203\211\353\252\251\353\241\235.md" "b/_posts/2023-10-18-\355\225\240\354\235\274-\352\262\200\354\203\211\353\252\251\353\241\235.md"
index 7953d73..efebdfa 100644
--- "a/_posts/2023-10-18-\355\225\240\354\235\274-\352\262\200\354\203\211\353\252\251\353\241\235.md"
+++ "b/_posts/2023-10-18-\355\225\240\354\235\274-\352\262\200\354\203\211\353\252\251\353\241\235.md"
@@ -28,7 +28,6 @@ last_modified_at: 2023-10-18T08:00:00-10:00:00
- camelcase
- cababcase
- snakeacse
- - [ ] [Web Socket](../../통신/통신-Web-Socket)
- [ ] 소켓 상태
---
diff --git "a/_posts/2023-10-20-\355\206\265\354\213\240-Websocket.md" "b/_posts/2023-10-20-\355\206\265\354\213\240-Websocket.md"
index 0c6e465..30d3bff 100644
--- "a/_posts/2023-10-20-\355\206\265\354\213\240-Websocket.md"
+++ "b/_posts/2023-10-20-\355\206\265\354\213\240-Websocket.md"
@@ -1,22 +1,64 @@
---
-title : "Websocket"
-excerpt : "Websocket"
+title : "WebSocket"
+excerpt : "WebSocket"
toc : true
toc_sticky : true
-toc_label : "Websocket"
+toc_label : "WebSocket"
categories:
- 통신
tags:
-- [통신, 미완료]
+- [통신, ServerCommon]
last_modified_at: 2023-10-20T08:00:00-10:00:00
---
# 날짜 : 2023-10-20 14:45
-# 태그 : #통신 #미완료
+# 태그 : #통신 #ServerCommon
---
-- HTTP 80, 443 포트에서 동작
+
+# 내용
+
+## 정의
+> WebSocket이란?
+> 서버와 클라이언트 간 양방향 데이터 전송이 가능하도록 하는 통신방법 중 하나
+
+## 특징
+- Stateful Protocol
+- 웹소켓을 위한 별도 포트는 없고 기존 포트 사용
+- 프로그램으로 구성된 메시지라는 논리적 단위로 송수신
+- 텍스트와 바이너리만 전송 가능
+- 웹 브라우저와 웹서버 간의 상호작용에서 오버헤드가 낮음
+- 실시간 데이터 전송 용이
+
+## 동작방식
+
+![image](../../assets/images/WebSocketProcess.png)
+- 연결 설정을 위한 handshake(HTTP), 일정 시간 경과 후 HTTP 연결은 끊어짐
+- 설정된 연결은 열린 상태로 유지(TCP/IP 기반), 클라이언트나 서버가 종료될 때까지 동일 채널에서 통신 수행
+- 양방향 통신
+- Cleint 또는 Server에서 Close 요청시, Disconnet
+
+## 문제점
+
+### 복잡성
+- Stateful protocol 이기 때문에 서버와 클라이언트간 연결을 항상 유지해야 함
+- 비정상적 연결 종료시, 예외처리 코드 필요
+
+### 비용
+- Socket 연결을 유지하는 데 비용 발생
+- 트래픽이 많은 경우 서버 CPU에 큰 부담
+
+### 호환성
+- 오래된 버전의 웹 브라우저에서는 지원되지 않음
+
+## Reference
+- SNS
+- 멀티 플레이어 Game
+- 위치 기반 APP
+- HTS
+- 화상 채팅 APP
---
# 연결문서
+- [HTTP](../../servercommon/ServerCommon-HTTP)
\ No newline at end of file
diff --git a/_posts/2023-10-25-Annotation-@EnableWebMvc.md b/_posts/2023-10-25-Annotation-@EnableWebMvc.md
index f745833..b2e090b 100644
--- a/_posts/2023-10-25-Annotation-@EnableWebMvc.md
+++ b/_posts/2023-10-25-Annotation-@EnableWebMvc.md
@@ -24,6 +24,7 @@ last_modified_at: 2023-10-25T08:00:00-10:00:00
## 역할
- @Configuration Annotation과 함께 쓰여 클래스가 Spring MVC의 구성요소중 하나임을 표기
- WebMvcConfigurationSupport 에서 Spring MVC 구성을 가져온다.
+- ViewResolver 값 등록
---
diff --git a/_posts/2023-10-25-Spring-Servlet.md b/_posts/2023-10-25-Spring-Servlet.md
index dc01cb5..bf75be7 100644
--- a/_posts/2023-10-25-Spring-Servlet.md
+++ b/_posts/2023-10-25-Spring-Servlet.md
@@ -60,3 +60,4 @@ public interface Servlet {
---
# 연결문서
+- [DispatcherServlet](../../spring/Spring-DispatcherServlet)
\ No newline at end of file
diff --git a/_posts/2023-10-25-Spring-SpringMVC.md b/_posts/2023-10-25-Spring-SpringMVC.md
index b719680..d91c88e 100644
--- a/_posts/2023-10-25-Spring-SpringMVC.md
+++ b/_posts/2023-10-25-Spring-SpringMVC.md
@@ -42,6 +42,7 @@ last_modified_at: 2023-10-25T08:00:00-10:00:00
### DispatcherServlet
- request를 처리할 Controller 를 배정
- 결과 View를 user에게 전달
+- 서블릿으로 등록하며, 모든 경로에 urlPatterns="/" 매핑
### Handler
- Controller
@@ -55,13 +56,9 @@ last_modified_at: 2023-10-25T08:00:00-10:00:00
- View Name으로 반환할 View를 탐색
- View에 Model 데이터를 삽입
-## Spring MVC 동작 방식
-
-### DispatcherServlet
-- 서블릿으로 등록하며, 모든 경로에 urlPatterns="/" 매핑
-
---
# 연결문서
- [SpringMVC 구현](../../spring/Spring-SpringMVC-구현)
-- [Servlet](../../spring/Spring-Servlet)
\ No newline at end of file
+- [Servlet](../../spring/Spring-Servlet)
+- [DispatcherServlet](../../spring/Spring-DispatcherServlet)
\ No newline at end of file
diff --git a/_posts/2023-10-25-Spring-WebMvcConfigurer.md b/_posts/2023-10-25-Spring-WebMvcConfigurer.md
index 5d35550..befb9ad 100644
--- a/_posts/2023-10-25-Spring-WebMvcConfigurer.md
+++ b/_posts/2023-10-25-Spring-WebMvcConfigurer.md
@@ -51,6 +51,7 @@ public void configureViewResolvers(ViewResolverRegistry registry) {
}
```
+>
> [@EnableWebMvc](../../annotation/Annotation-@EnableWebMvc) Annotation과 함께 적용해야 한다.
### 리소스 핸들링
@@ -60,8 +61,27 @@ public void configureViewResolvers(ViewResolverRegistry registry) {
```java
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
- registry.addResourceHandler("/static/**")
- .addResourceLocations("classpath:/static/");
+ registry.addResourceHandler("/assets/**")
+ .addResourceLocations("classpath:/static/assets/");
+ registry.addResourceHandler("/static/**")
+ .addResourceLocations("classpath:/static/");
+}
+```
+
+>
+> ResourceLocation은 폴더구조상의 경로
+> ResourceHandler는 request 요청상의 경로이다
+
+>
+> http://localhost:8080/assets/my.js 이렇게 request가 들어왔다고 가정하면 classpath:/static/assets/ 경로에서 .js파일을 찾을 것이다.
+
+### Exception 핸들링
+- Contoller 밖으로 Throw된 exception을 처리하고 동작방식 재정의
+
+```java
+@Override
+public void extendHandlerExceptionResolvers(List resolvers) {
+ resolvers.add(new MyHandlerExceptionResolver());
}
```
@@ -115,3 +135,4 @@ public void addCorsMappings(CorsRegistry registry) {
---
# 연결문서
+- [DispatcherServlet](../../spring/Spring-DispatcherServlet)
\ No newline at end of file
diff --git "a/_posts/2023-10-30-webcommon-Proxy\354\204\234\353\262\204.md" "b/_posts/2023-10-30-webcommon-Proxy\354\204\234\353\262\204.md"
new file mode 100644
index 0000000..6ac3701
--- /dev/null
+++ "b/_posts/2023-10-30-webcommon-Proxy\354\204\234\353\262\204.md"
@@ -0,0 +1,53 @@
+---
+title : "Proxy서버"
+excerpt : "Proxy서버"
+toc : true
+toc_sticky : true
+toc_label : "Proxy서버"
+categories:
+- WebCommon
+tags:
+- [WebCommon]
+last_modified_at: 2023-10-30T08:00:00-10:00:00
+---
+
+# 날짜 : 2023-10-30 14:44
+
+# 태그 : #WebCommon
+---
+
+# 내용
+
+## 정의
+> Proxy서버란?
+> 내부 네트워크에서 인터넷을 접속할 때, 빠른 액세스나 안전한 통신을 확보하기 위한 중계자
+
+- Client와 Web Server의 중간에 위치
+
+![image](../../assets/images/ProxyBase.png)
+
+## 기능
+- Server IP가 아닌 Proxy IP를 노출하여 개인정보 보호
+- 캐시 사용으로 속도 향상
+- 로그 관리 편의성
+- 허용된 IP 대역의 프록시를 사용하여 접속 우회
+
+## 종류
+
+### Forward Proxy
+- Client 대신 Proxy가 목적 서버에 통신해주는 구성
+- 요청을 중계하며 요청과 응답은 모두 Proxy를 거친다
+- 클라이언트를 감추는 효과
+
+![image](../../assets/images/ForwardProxy%201.png)
+
+### Reverse Proxy
+- 내부서버 대신 Proxy가 Client와 통신해주는 구성
+- 응답을 중계하며 요청과 응답은 모두 Proxy를 거친다.
+- 내부 서버를 감추는 효과
+
+![image](../../assets/images/ReverseProxy.png)
+
+---
+
+# 연결문서
diff --git "a/_posts/2023-11-16-obsidian-\354\212\244\355\203\200\354\235\274 \354\240\201\354\232\251.md" "b/_posts/2023-11-16-obsidian-\354\212\244\355\203\200\354\235\274 \354\240\201\354\232\251.md"
new file mode 100644
index 0000000..6c95a30
--- /dev/null
+++ "b/_posts/2023-11-16-obsidian-\354\212\244\355\203\200\354\235\274 \354\240\201\354\232\251.md"
@@ -0,0 +1,31 @@
+---
+title : "스타일 적용"
+excerpt : "스타일 적용"
+toc : true
+toc_sticky : true
+toc_label : "스타일 적용"
+categories:
+- Obsidian
+tags:
+- [Obsidian]
+last_modified_at: 2023-11-16T08:00:00-10:00:00
+---
+
+# 날짜 : 2023-11-16 10:36
+
+# 태그 : #Obsidian
+---
+
+# 내용
+
+## CSS 파일 적용 방법
+
+![image](../../assets/images/SetCSS.png)
+1. 설정-테마-CSS스니펫 항목의 폴더 아이콘을 선택하여 옵시디언에 사용할 css 폴더 경로로 이동한다
+2. 적용할 css파일을 위치시킨다
+3. 다시 설정-테마-CSS스니펫의 새로고침 아이콘을 클릭하면 위치시킨 css파일이 목록에 보이게 된다.
+4. css를 활성화 시키면 옵시디언 테마에 적용된다.
+
+---
+
+# 연결문서
diff --git "a/_posts/2023-11-17-\355\206\265\354\213\240-Socket.md" "b/_posts/2023-11-17-\355\206\265\354\213\240-Socket.md"
index de2cd20..60d76bb 100644
--- "a/_posts/2023-11-17-\355\206\265\354\213\240-Socket.md"
+++ "b/_posts/2023-11-17-\355\206\265\354\213\240-Socket.md"
@@ -45,5 +45,5 @@ last_modified_at: 2023-11-17T08:00:00-10:00:00
---
# 연결문서
-- [Web Socket](../../통신/통신-Web-Socket)
+- [WebSocket](../../통신/통신-WebSocket)
- [Port](../../developcommon/DevelopCommon-Port)
\ No newline at end of file
diff --git a/_posts/2023-11-24-ServerCommon-Thread Dump.md b/_posts/2023-11-24-ServerCommon-Thread Dump.md
index 316a0c7..ba6a11e 100644
--- a/_posts/2023-11-24-ServerCommon-Thread Dump.md
+++ b/_posts/2023-11-24-ServerCommon-Thread Dump.md
@@ -7,13 +7,13 @@ toc_label : "Thread Dump"
categories:
- ServerCommon
tags:
-- [ServerCommon, java, 미완료]
+- [ServerCommon, java]
last_modified_at: 2023-11-24T08:00:00-10:00:00
---
# 날짜 : 2023-11-24 14:37
-# 태그 : #ServerCommon #java #미완료
+# 태그 : #ServerCommon #java
---
# 내용
@@ -40,6 +40,12 @@ last_modified_at: 2023-11-24T08:00:00-10:00:00
### 사용방법
+#### dump 파일 로드
+
+![image](../../assets/images/MATOpenHeapDump.png)
+- 팝업된 윈도우 탐색기에서 .hprof 파일을 선택한다.
+- MAT가 해당 덤프파일을 분석하여 결과를 보여준다.
+
### 분석
#### dominator_tree
diff --git "a/_posts/2023-11-27-python-python \355\224\204\353\241\234\354\240\235\355\212\270.md" "b/_posts/2023-11-27-python-python \355\224\204\353\241\234\354\240\235\355\212\270.md"
index 8c96bb5..7afaa1a 100644
--- "a/_posts/2023-11-27-python-python \355\224\204\353\241\234\354\240\235\355\212\270.md"
+++ "b/_posts/2023-11-27-python-python \355\224\204\353\241\234\354\240\235\355\212\270.md"
@@ -7,13 +7,13 @@ toc_label : "python 프로젝트"
categories:
- python
tags:
-- [미완료]
+- [python, 미완료]
last_modified_at: 2023-11-27T08:00:00-10:00:00
---
# 날짜 : 2023-11-27 12:19
-# 태그 : #미완료
+# 태그 : #python #미완료
---
# 내용
diff --git "a/_posts/2023-12-13-developcommon-\354\206\214\355\224\204\355\212\270\354\233\250\354\226\264 \353\235\274\354\235\264\354\204\240\354\212\244.md" "b/_posts/2023-12-13-developcommon-\354\206\214\355\224\204\355\212\270\354\233\250\354\226\264 \353\235\274\354\235\264\354\204\240\354\212\244.md"
new file mode 100644
index 0000000..a0ce3be
--- /dev/null
+++ "b/_posts/2023-12-13-developcommon-\354\206\214\355\224\204\355\212\270\354\233\250\354\226\264 \353\235\274\354\235\264\354\204\240\354\212\244.md"
@@ -0,0 +1,34 @@
+---
+title : "소프트웨어 라이선스"
+excerpt : "소프트웨어 라이선스"
+toc : true
+toc_sticky : true
+toc_label : "소프트웨어 라이선스"
+categories:
+- DevelopCommon
+tags:
+- [DevelopCommon]
+last_modified_at: 2023-12-13T08:00:00-10:00:00
+---
+
+# 날짜 : 2023-12-13 15:28
+
+# 태그 : #DevelopCommon
+---
+
+# 내용
+
+## 라이선스 종류
+
+| 라이선스 | 설명 |
+|------------------------------|------------------------------------------------------------------------------------------------------|
+| MIT 라이선스 | 가장 자유로운 라이선스 중 하나. 코드 수정, 복제, 배포, 상업적 이용 가능. 다만 소프트웨어와 소프트웨어에 포함된 모든 복제물에서 저작권 고지 및 이 허용 고지를 포함해야 함. |
+| GNU GPL | 코드 수정 시 해당 코드를 공개해야 하는 "강제" 라이선스. 상업 및 비상업 프로젝트 모두에 적용 가능. |
+| Apache 라이선스 | 개방형 표준을 지키면서도 거의 모든 용도로 사용 가능한 라이선스. 상업적 이용 가능. |
+| BSD 라이선스 | 소프트웨어 수정, 복제, 재배포가 자유로운 라이선스. "2-클로즈드" 라이선스와 "3-오픈" 라이선스로 구분됨. |
+| Creative Commons | 주로 컨텐츠(문서, 그림, 음악 등)에 사용되는 라이선스. 다양한 유형이 있으며, 상업적 이용, 변경, 배포 등에 대한 규정이 있음. |
+| Eclipse Public License (EPL) | 상업적 및 비상업적 사용 모두 가능. Eclipse Foundation에서 사용하는 라이선스로 자바 기반의 오픈 소스 프로젝트에서 많이 사용됨. |
+
+---
+
+# 연결문서
diff --git a/_posts/2023-12-13-spring-AOP.md b/_posts/2023-12-13-spring-AOP.md
new file mode 100644
index 0000000..61b8dcd
--- /dev/null
+++ b/_posts/2023-12-13-spring-AOP.md
@@ -0,0 +1,67 @@
+---
+title : "AOP"
+excerpt : "AOP"
+toc : true
+toc_sticky : true
+toc_label : "AOP"
+categories:
+- Spring
+tags:
+- [Spring, AOP]
+last_modified_at: 2023-12-13T08:00:00-10:00:00
+---
+
+# 날짜 : 2023-12-13 16:51
+
+# 태그 : #Spring #AOP
+---
+
+# 내용
+
+## 정의
+> AOP란?
+> Aspect Oriented Programming(관점 지향 프로그래밍)
+> 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누고 그 기준을 각각 모듈화하는 관점 지향 프로그래밍 방법
+
+## 목적
+
+![image](../../assets/images/AOPConcept.png)
+- 위와 같이 소스코드상에서 다른 부분에 계속 반복하여 사용하는 코드들을 Aspect로 모듈화
+- 핵심적인 비즈니스 로직에서 분리하여 재사용
+
+## 주요개념
+
+| 용어 | 설명 |
+| --------- |:----------------------------------------------------------------------- |
+| Aspect | 모듈화된 관심사, 주로 부가기능을 모듈화 |
+| Target | Aspect를 적용하는 곳, Advice의 대상이 되는 객체 (Class, Method) |
+| Advice | 실질적으로 어떤일을 할지 정의한 구현체 |
+| Advisor | Spring AOP에서만 사용되는 용어, Advice + PointCut 한쌍 |
+| JoinPoint | Adivce가 적용될 위치, 메서드 자체(메서드 진입점, 생성자 호출 시점, 필드값 획득시 등) |
+| PointCut | JoinPoint의 상세 스펙을 정의 |
+| Weaving | PointCut으로 설정한 타겟의 Join Point 에 Advice를 적용하는 것 |
+| AOP프록시 | AOP 기능을 구현하기 위해 만든 프록시 객체 |
+
+## 적용시점
+
+### Compile 시점
+- java 컴파일러를 통한 .class 생성 시점에 부가기능 추가
+- 모든 지점에 적용 가능
+- AspectJ 컴파일러 사용
+
+### Class Loading 시점
+- JVM 내부 Class Loader에 .class 파일을 보관하기 전 부가기능 추가
+- 모든 지점에 적용 가능
+
+### Runtime 시점
+- **스프링에서 사용하는 방식**
+- Application이 실행 된 후 동작하는 런타임 방식
+- 실제 코드는 그대로 유지되며, Proxy를 통해 부가 기능 적용
+- Proxy는 메서드 오버라이딩 방식으로 동작하기때문에 메서드에만 적용 가능
+- 구현이 쉽다.
+
+---
+
+# 연결문서
+- [@Aspect](../../aop/AOP-@Aspect)
+- [Pointcut Designator](../../spring/Spring-Pointcut-Designator)
\ No newline at end of file
diff --git a/_posts/2023-12-14-aop-@Aspect.md b/_posts/2023-12-14-aop-@Aspect.md
new file mode 100644
index 0000000..25fb932
--- /dev/null
+++ b/_posts/2023-12-14-aop-@Aspect.md
@@ -0,0 +1,91 @@
+---
+title : "@Aspect"
+excerpt : "@Aspect"
+toc : true
+toc_sticky : true
+toc_label : "@Aspect"
+categories:
+- AOP
+tags:
+- [Spring, Annotation, AOP]
+last_modified_at: 2023-12-14T08:00:00-10:00:00
+---
+
+# 날짜 : 2023-12-14 12:13
+
+# 태그 : #Spring #Annotation #AOP
+---
+
+# 내용
+
+## Artifact
+- org.aspectj:aspectjrt
+
+## 설정
+
+### build.gradle
+
+```groovy
+implementation 'org.springframework:spring-aop:3.2.3.RELEASE'
+implementation 'org.aspectj:aspectjrt:1.6.10'
+implementation 'org.aspectj:aspectjweaver:1.9.19'
+```
+
+### WebMvcConfigurer
+
+```java
+@EnableWebMvc
+@ComponentScan(basePackages = "com.mvcvue")
+@EnableAspectJAutoProxy
+public class VueMvcConfigurer implements WebMvcConfigurer {
+...
+}
+```
+
+> [!caution]
+> @EnableAspectJAutoProxy Annotation은 Spring Bean이 초기되 된 이후 시점에 적용되어야 한다.
+
+## 역할
+- Advisor를 만들기 위한 Annotation
+
+> [!caution]
+> @Aspect Annotation Component 스캔 기능이 없으므로 반드시 Bean으로 등록해줘야한다.
+> **@Bean @Component @Import**
+
+## 사용법
+
+### @Aspect
+- @Aspect Annotation 적용
+- Class에 적용해야한다.
+- [Advice 선언](../../spring/Spring-Advice) [Pointcut 적용](../../spring/Spring-Pointcut-Designator)
+
+```java
+@Component
+@Aspect
+public class LoggingAspect {
+ @Around("* com.test..*.*(..)")
+ public void beforeLogger(JoinPoint joinPoint){
+ System.out.println("---------Before---------");
+ }
+}
+```
+
+### @EnableAspectJAutoProxy
+- Configure에 @EnableAspectJAutoProxy Annotation 적용
+
+```java
+@EnableWebMvc
+@ComponentScan(basePackages = "com.mvcvue")
+@EnableAspectJAutoProxy()
+public class VueMvcConfigurer implements WebMvcConfigurer {
+ ...
+}
+```
+
+---
+
+# 연결문서
+- [WebMvcConfigurer](../../spring/Spring-WebMvcConfigurer)
+- [AOP](../../spring/Spring-AOP)
+- [Pointcut Designator](../../spring/Spring-Pointcut-Designator)
+- [Advice](../../spring/Spring-Advice)
\ No newline at end of file
diff --git a/_posts/2023-12-14-git-Git-Bash CLI.md b/_posts/2023-12-14-git-Git-Bash CLI.md
new file mode 100644
index 0000000..df1e962
--- /dev/null
+++ b/_posts/2023-12-14-git-Git-Bash CLI.md
@@ -0,0 +1,58 @@
+---
+title : "Git-Bash CLI"
+excerpt : "Git-Bash CLI"
+toc : true
+toc_sticky : true
+toc_label : "Git-Bash CLI"
+categories:
+- Git
+tags:
+- [Git, CLI, 미완료]
+last_modified_at: 2023-12-14T08:00:00-10:00:00
+---
+
+# 날짜 : 2023-12-14 18:24
+
+# 태그 : #Git #CLI #미완료
+---
+
+# 내용
+
+## 설정 정보
+
+### 설정 정보 확인
+
+```bash
+git config --list
+```
+
+### 사용자명 변경
+
+```bash
+git config --global user.name <사용자명>
+```
+
+### 이메일 주소 변경
+
+```bash
+git config --global user.email <이메일주소>
+```
+
+### 계정정보 삭제
+
+```bash
+git config --unset user.name
+git config --unset user.email
+```
+
+## SSH
+
+### ssh key 생성
+```
+ssh-keygen
+```
+
+---
+
+# 연결문서
+- [SSH](../../통신/통신-SSH)
\ No newline at end of file
diff --git a/_posts/2023-12-14-spring-MockMVC.md b/_posts/2023-12-14-spring-MockMVC.md
new file mode 100644
index 0000000..72a9c79
--- /dev/null
+++ b/_posts/2023-12-14-spring-MockMVC.md
@@ -0,0 +1,31 @@
+---
+title : "MockMVC"
+excerpt : "MockMVC"
+toc : true
+toc_sticky : true
+toc_label : "MockMVC"
+categories:
+- Spring
+tags:
+- [Spring, BackEnd, TDD, 미완료]
+last_modified_at: 2023-12-14T08:00:00-10:00:00
+---
+
+# 날짜 : 2023-12-14 13:51
+
+# 태그 : #Spring #BackEnd #TDD #미완료
+---
+
+# 내용
+
+## 정의
+> MockMVC란?
+> Web Application을 배포하지 않고 Spring MVC의 동작을 재현할 수 있는 테스트 도우미
+
+## Artifact
+- org.springframework.test.web.servlet
+
+---
+
+# 연결문서
+- [SpringMVC](../../spring/Spring-SpringMVC)
\ No newline at end of file
diff --git a/_posts/2023-12-15-spring-DispatcherServlet.md b/_posts/2023-12-15-spring-DispatcherServlet.md
new file mode 100644
index 0000000..46c07e0
--- /dev/null
+++ b/_posts/2023-12-15-spring-DispatcherServlet.md
@@ -0,0 +1,92 @@
+---
+title : "DispatcherServlet"
+excerpt : "DispatcherServlet"
+toc : true
+toc_sticky : true
+toc_label : "DispatcherServlet"
+categories:
+- Spring
+tags:
+- [Spring]
+last_modified_at: 2023-12-15T08:00:00-10:00:00
+---
+
+# 날짜 : 2023-12-15 17:13
+
+# 태그 : #Spring
+---
+
+# 내용
+
+## 정의
+> DispatcherServlet이란?
+> HTTP 프로토콜로 들러오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 Front Controller
+
+## 장점
+- web.xml 역할 축소
+- Contoller 구현만 하면, DispatcherServlet이 알아서 적합한 컨트롤러로 위임
+
+## 구조
+- 구조를 중요한 Field 기준으로 확인해보자
+
+```java
+private List handlerMappings;
+private List handlerAdapters;
+private List viewResolvers;
+private List handlerExceptionResolvers;
+private MultipartResolver multipartResolver;
+private LocaleResolver localeResolver;
+private ThemeResolver themeResolver;
+```
+
+### HandlerMapping
+- 어떤 컨트롤러가 해당 요청을 처리 할 수 있을지 식별
+
+### HandlerAdapter
+- 컨트롤러의 구현 방식이 다양하기때문에 Dispatcher에서 직접 Controller를 호출하는 것이 아니라 HandlerAdapter를 통해 위임
+
+### ViewResolver
+- Response가 화면일 경우 View 이름에 맞는 View를 찾아 반환해주는 역할
+
+### HandlerExceptionResolver
+- Controller 밖으로 Throw 된 예외를 해결하고 동작방식을 변경
+- 예외 발생시 보여줄 ModelAndView 설정
+
+### MultipartResolver
+- 파일 업로드와 같은 Multipart 요청을 처리하기 위한 인터페이스
+- 클라이언트로부터 전송된 HTTP 요청에서 Multipart 데이터를 읽고 해석하는 기능 제공
+
+#### 사용방법
+- MultipartResolver Bean을 등록한다.
+
+```java
+@Bean
+public MultipartResolver multipartResolver(
+ @Value("#{Properties['common.file.maxUploadSizePerFile']}") Long maxUploadSizePerFile) {
+ CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
+ multipartResolver.setMaxUploadSize(-1); // no limit
+ multipartResolver.setMaxUploadSizePerFile(maxUploadSizePerFile);
+ return multipartResolver;
+}
+```
+
+### LocaleResolver
+- 국제화 기능을 구현하기 위해서 어떤 언어로 페이지를 보여줄지 설정
+
+#### 사용방법
+- LocaleResolver Bean 을 등록한다.
+
+```java
+@Bean
+public LocaleResolver localeResolver() {
+ return new AcceptHeaderLocaleResolver();
+}
+```
+
+### ThemeResolver
+- 페이지에서 사용할 테마를 설정
+
+---
+
+# 연결문서
+- [WebMvcConfigurer](../../spring/Spring-WebMvcConfigurer)
\ No newline at end of file
diff --git a/_posts/2023-12-18-aop-@Around.md b/_posts/2023-12-18-aop-@Around.md
new file mode 100644
index 0000000..b592e78
--- /dev/null
+++ b/_posts/2023-12-18-aop-@Around.md
@@ -0,0 +1,61 @@
+---
+title : "@Around"
+excerpt : "@Around"
+toc : true
+toc_sticky : true
+toc_label : "@Around"
+categories:
+- AOP
+tags:
+- [Spring, Annotation, AOP]
+last_modified_at: 2023-12-18T08:00:00-10:00:00
+---
+
+# 날짜 : 2023-12-18 13:56
+
+# 태그 : #Spring #Annotation #AOP
+---
+
+# 내용
+
+## Artifact
+- org.aspectj:aspectjrt
+
+## 역할
+- Pointcut 명시
+
+## 특징
+- proceed를 반드시 명시적으로 적어야한다.
+- 입력, 반환값 자체를 다른 객체로 조작 가능
+
+## 파라미터
+
+### ProceedingJoinPoint
+
+| 주요 기능 | 설명 |
+| -------------- |:-------------------------------- |
+| getArgs() | 메서드 인수 반환 |
+| getThis() | 프록시 객체 반환 |
+| getTarget() | 대상 객체 반환 |
+| getSignature() | 조언되는 메서드에 대한 설명 |
+| toString() | 조언되는 방법에 대한 유용한 설명 |
+| proceed() | 다음 Advice, Target method 호출 |
+
+## 사용법
+- [@Aspect](../../aop/AOP-@Aspect)가 적용된 Class 하위 메서드에 Around Annotation을 사용
+
+```java
+@Around("execution(* com.mvcvue.controller..*.*(..))")
+public Object aroundLogger(ProceedingJoinPoint joinPoint, Object obj) throws Throwable{
+ System.out.println("Around Pointcut");
+ return joinPoint.proceed();
+}
+```
+
+---
+
+# 연결문서
+- [AOP](../../spring/Spring-AOP)
+- [@Aspect](../../aop/AOP-@Aspect)
+- [Pointcut Designator](../../spring/Spring-Pointcut-Designator)
+- [Advice](../../spring/Spring-Advice)
\ No newline at end of file
diff --git a/_posts/2023-12-18-spring-Advice.md b/_posts/2023-12-18-spring-Advice.md
new file mode 100644
index 0000000..51b7c79
--- /dev/null
+++ b/_posts/2023-12-18-spring-Advice.md
@@ -0,0 +1,116 @@
+---
+title : "Advice"
+excerpt : "Advice"
+toc : true
+toc_sticky : true
+toc_label : "Advice"
+categories:
+- Spring
+tags:
+- [Spring, AOP]
+last_modified_at: 2023-12-18T08:00:00-10:00:00
+---
+
+# 날짜 : 2023-12-18 18:50
+
+# 태그 : #Spring #AOP
+---
+
+# 내용
+
+## 정의
+> Advice란?
+> 실질적으로 프록시에서 수행하게 되는 로직을 명세
+
+## 특징
+
+## 종류
+
+| Advice종류 | 설명 |
+| --------------- |:----------------------------------------------------------------- |
+| [@Around](../../aop/AOP-@Around) | 메서드 호출 전후작업 조인포인트 실행여부 반환값 예외 등 설정 가능 |
+| [@Before](../../aop/AOP-@Before) | JoinPoint 이전에 실행 |
+| [@AfterReturning](../../aop/AOP-@AfterReturning) | JoinPoint 정상 완료 후 실행 |
+| [@AfterThrowing](../../aop/AOP-@AfterThrowing) | 메서드에서 예외가 발생할 경우 실행 |
+| [@After](../../aop/AOP-@After) | JoinPoint 정상, 예외 발생과 무관하게 실행 |
+
+### Annotation 동작 순서
+
+![image](../../assets/images/AdviceAnnotationOrder.png)
+
+>
+> 같은 Advice가 한 JoinPoint에 적용되어 있을 경우 임의의 순서로 동작하는데, 이때 [@Order](../../annotation/Annotation-@Order) Annotation을 적용하여 순서를 지정할 수 있다.
+
+## Example
+
+```java
+//LoggingAspect
+@Component
+@Aspect
+public class LoggingAspect {
+ @Around("execution(* com.mvcvue.controller..*.*(..))")
+ public Object aroundLogger(ProceedingJoinPoint joinPoint) throws Throwable{
+ System.out.println("aroundLogger");
+ return joinPoint.proceed();
+ }
+
+ @Before("execution(* com.mvcvue.controller..*.*(..))")
+ public void beforeLogger(JoinPoint joinPoint){
+ System.out.println("beforeLogger");
+ }
+
+ @AfterReturning("execution(* com.mvcvue.controller..*.*(..))")
+ public void afterReturningLogger(JoinPoint joinPoint){
+ System.out.println("afterReturningLogger");
+ }
+
+ @AfterThrowing("execution(* com.mvcvue.controller..*.*(..))")
+ public void afterThrowingLogger(JoinPoint joinPoint){
+ System.out.println("afterThrowingLogger");
+ }
+
+ @After("execution(* com.mvcvue.controller..*.*(..))")
+ public void afterLogger(JoinPoint joinPoint){
+ System.out.println("afterLogger");
+ }
+}
+```
+
+```java
+//HelloController
+@Controller
+@RequestMapping("/api/hello")
+public class HelloController {
+ @GetMapping
+ public ResponseEntity hello(){
+ System.out.println("Hello Contoller 로직 수행!");
+ return ResponseEntity.ok("hello");
+ }
+
+ @GetMapping("/exception")
+ public void exception() throws FileNotFoundException {
+ throw new FileNotFoundException();
+ }
+}
+```
+
+### API 호출 테스트 결과
+- http://localhost:8080/api/hello
+
+![image](../../assets/images/PostManCallHelloAPI.png)
+
+![image](../../assets/images/CallHelloAPIResult.png)
+
+- http://localhost:8080/api/hello/exception
+
+![image](../../assets/images/PostManCallExceptionResult.png)
+
+![image](../../assets/images/CallExceptionAPIResult.png)
+
+---
+
+# 연결문서
+- [Pointcut Designator](../../spring/Spring-Pointcut-Designator)
+- [AOP](../../spring/Spring-AOP)
+- [@Aspect](../../aop/AOP-@Aspect)
+- [@Order](../../annotation/Annotation-@Order)
\ No newline at end of file
diff --git a/_posts/2023-12-18-spring-Pointcut Designator.md b/_posts/2023-12-18-spring-Pointcut Designator.md
new file mode 100644
index 0000000..fe443b8
--- /dev/null
+++ b/_posts/2023-12-18-spring-Pointcut Designator.md
@@ -0,0 +1,136 @@
+---
+title : "Pointcut Designator"
+excerpt : "Pointcut Designator"
+toc : true
+toc_sticky : true
+toc_label : "Pointcut Designator"
+categories:
+- Spring
+tags:
+- [Spring]
+last_modified_at: 2023-12-18T08:00:00-10:00:00
+---
+
+# 날짜 : 2023-12-18 15:04
+
+# 태그 : #Spring
+---
+
+# 내용
+
+## 정의
+> Pointcut 지시자란?
+> 어떤 메서드가 Aspect에 의해 가로채질 것인지 패턴으로 지정
+
+## 메서드 선택
+
+### execution
+- 가장 많이 사용되는 지시자
+- **execution(<접근제한자> <반환타입> <패키지>.<패키지>.<클래스>.<메소드>(<인자>))**
+- <접근제한자> <반환타입> <패키지경로>.\.<메서드명>(<매개변수>)
+- 여기서 **..**은 임의의 개수의 패키지 레벨이나 임의의 개수의 매개변수, **\*** 는 임의의 문자열을 의미
+- <접근제한자> 항목은 생략이 가능하며 모든 접근 제한자를 지시한다.
+
+#### example
+
+```java
+// 메서드 직접 지정
+execution(public String com.mvcvue.controller.api.hello.HelloController.hello())
+
+// 반환타입 모두 포함, 함수명 패턴 적용
+execution(public * com.mvcvue.controller.api.hello.HelloController.*ell*())
+
+// 반환타입 모두 포함, 패키지 하위 모든 클래스, 함수명 패턴 적용, 파라미터 모두 포함
+execution(public * com.mvcvue.controller.api.hello.*.*ell*(..))
+
+// 모든 접근제한자, controller 하위 패키지의 모든 클래스의 모든 메서드 포함, 파라미터 모두 포함
+execution(* com.mvcvue.controller..*.*(..))
+```
+
+### within
+- [execution](#execution)에서 패키지와 클래스 부분만 사용
+
+#### example
+
+```java
+//com.mvcvue.controller 하위 모든 패키지의 모든 클래스
+within(com.mvcvue.controller..*)
+```
+
+### @target
+- 인스턴스의 모든 메서드를 Joinpoint로 적용
+- 즉 부모타입의 메서드까지 포함
+
+#### example
+
+```java
+@target(org.springframework.stereotype.Controller)
+```
+
+### @within
+- 인스턴스의 모든 메서드를 Joinpoint로 적용
+- 해당 타입 내에 있는 메서드만 Joinpoint로 적용
+
+#### example
+
+```java
+@within(org.springframework.stereotype.Controller)
+```
+
+## 매개변수 전달
+
+### @annotation
+- Method의 Annotation 검색
+
+#### example
+
+```java
+@Around("@annotation(org.springframework.web.bind.annotation.GetMapping)")
+```
+
+### args
+- 매칭되는 메서드에서 매개변수만 얻어올 때 사용
+
+#### example
+
+```java
+@Around("args(arg)")
+public Object aroundArgLogger(ProceedingJoinPoint joinPoint, String arg) throws Throwable{
+ System.out.println("arg : " + arg);
+ return joinPoint.proceed();
+}
+```
+
+### this
+- 매칭되는 메서드에서 프록시 객체를 가져올때, 사용
+
+#### example
+
+```java
+@Around("execution(* com.mvcvue.controller..*.*(..)) && this(obj)")
+public Object aroundLogger(ProceedingJoinPoint joinPoint, Object obj) throws Throwable{
+ System.out.println("obj : " + obj);
+ return joinPoint.proceed();
+}
+```
+
+### target
+- 매칭되는 메서드에서 실제 대상 객체를 가져올 때, 사용
+
+#### example
+
+```java
+@Around("execution(* com.mvcvue.controller..*.*(..)) && this(obj) && target(targetObj)")
+public Object aroundLogger(ProceedingJoinPoint joinPoint, Object obj, Object targetObj) throws Throwable{
+ System.out.println("obj : " + obj);
+ System.out.println("targetObj : " + targetObj);
+ return joinPoint.proceed();
+}
+```
+
+---
+
+# 연결문서
+- [AOP](../../spring/Spring-AOP)
+- [@Aspect](../../aop/AOP-@Aspect)
+- [Advice](../../spring/Spring-Advice)
\ No newline at end of file
diff --git a/_posts/2023-12-22-annotation-@Order.md b/_posts/2023-12-22-annotation-@Order.md
new file mode 100644
index 0000000..8fbae51
--- /dev/null
+++ b/_posts/2023-12-22-annotation-@Order.md
@@ -0,0 +1,59 @@
+---
+title : "@Order"
+excerpt : "@Order"
+toc : true
+toc_sticky : true
+toc_label : "@Order"
+categories:
+- Annotation
+tags:
+- [Spring, Annotation]
+last_modified_at: 2023-12-22T08:00:00-10:00:00
+---
+
+# 날짜 : 2023-12-22 14:39
+
+# 태그 : #Spring #Annotation
+---
+
+# 내용
+
+## Artifact
+- org.springframework:spring-core
+
+## 역할
+- Bean의 우선순위를 지정
+
+## 특징
+- value가 작을수록 우선순위가 높아 앞쪽으로 정렬
+- N개의 Bean중 일부만 @Order Annotation이 적용되어 있다면 나머지 Bean은 임의의 순서로 적용됨
+
+## 사용법
+
+```java
+@Component
+@Aspect
+public class LoggingAspect {
+ @Before("execution(* com.mvcvue.controller..*.*(..))")
+ @Order(2)
+ public void beforeLogger2(JoinPoint joinPoint){
+ System.out.println("beforeLogger222");
+ }
+
+ @Before("execution(* com.mvcvue.controller..*.*(..))")
+ @Order(1)
+ public void beforeLogger1(JoinPoint joinPoint){
+ System.out.println("beforeLogger111");
+ }
+
+ @Before("execution(* com.mvcvue.controller..*.*(..))")
+ @Order(3)
+ public void beforeLogger3(JoinPoint joinPoint){
+ System.out.println("beforeLogger333");
+ }
+}
+```
+
+---
+
+# 연결문서
diff --git a/_posts/2023-12-22-aop-@After.md b/_posts/2023-12-22-aop-@After.md
new file mode 100644
index 0000000..201cae1
--- /dev/null
+++ b/_posts/2023-12-22-aop-@After.md
@@ -0,0 +1,46 @@
+---
+title : "@After"
+excerpt : "@After"
+toc : true
+toc_sticky : true
+toc_label : "@After"
+categories:
+- AOP
+tags:
+- [Spring, Annotation, AOP]
+last_modified_at: 2023-12-22T08:00:00-10:00:00
+---
+
+# 날짜 : 2023-12-22 14:23
+
+# 태그 : #Spring #Annotation #AOP
+---
+
+# 내용
+
+## Artifact
+- org.aspectj:aspectjrt
+
+## 역할
+- Pointcut 명시
+- JoinPoint 실행 후 비즈니스 로직 정의(Exception 발생 여부와 무관)
+
+## 특징
+- [@Around](../../aop/AOP-@Around)와 다르게 proceed 호출 없이 로직 수행 후 자동으로 target 메서드를 호출
+
+## 사용법
+
+```java
+@After("execution(* com.mvcvue.controller..*.*(..))")
+public void afterLogger(JoinPoint joinPoint){
+ System.out.println("afterLogger");
+}
+```
+
+---
+
+# 연결문서
+- [AOP](../../spring/Spring-AOP)
+- [@Aspect](../../aop/AOP-@Aspect)
+- [Pointcut Designator](../../spring/Spring-Pointcut-Designator)
+- [Advice](../../spring/Spring-Advice)
diff --git a/_posts/2023-12-22-aop-@AfterReturning.md b/_posts/2023-12-22-aop-@AfterReturning.md
new file mode 100644
index 0000000..25319e4
--- /dev/null
+++ b/_posts/2023-12-22-aop-@AfterReturning.md
@@ -0,0 +1,46 @@
+---
+title : "@AfterReturning"
+excerpt : "@AfterReturning"
+toc : true
+toc_sticky : true
+toc_label : "@AfterReturning"
+categories:
+- AOP
+tags:
+- [Spring, Annotation, AOP]
+last_modified_at: 2023-12-22T08:00:00-10:00:00
+---
+
+# 날짜 : 2023-12-22 14:18
+
+# 태그 : #Spring #Annotation #AOP
+---
+
+# 내용
+
+## Artifact
+- org.aspectj:aspectjrt
+
+## 역할
+- Pointcut 명시
+- JoinPoint 정상 처리 후 비즈니스 로직 정의 (Exception 발생시 미동작)
+
+## 특징
+- [@Around](../../aop/AOP-@Around)와 다르게 proceed 호출 없이 로직 수행 후 자동으로 target 메서드를 호출
+
+## 사용법
+
+```java
+@AfterReturning("execution(* com.mvcvue.controller..*.*(..))")
+public void afterReturningLogger(JoinPoint joinPoint){
+ System.out.println("afterReturningLogger");
+}
+```
+
+---
+
+# 연결문서
+- [AOP](../../spring/Spring-AOP)
+- [@Aspect](../../aop/AOP-@Aspect)
+- [Pointcut Designator](../../spring/Spring-Pointcut-Designator)
+- [Advice](../../spring/Spring-Advice)
\ No newline at end of file
diff --git a/_posts/2023-12-22-aop-@AfterThrowing.md b/_posts/2023-12-22-aop-@AfterThrowing.md
new file mode 100644
index 0000000..11cf006
--- /dev/null
+++ b/_posts/2023-12-22-aop-@AfterThrowing.md
@@ -0,0 +1,46 @@
+---
+title : "@AfterThrowing"
+excerpt : "@AfterThrowing"
+toc : true
+toc_sticky : true
+toc_label : "@AfterThrowing"
+categories:
+- AOP
+tags:
+- [Spring, Annotation, AOP]
+last_modified_at: 2023-12-22T08:00:00-10:00:00
+---
+
+# 날짜 : 2023-12-22 14:20
+
+# 태그 : #Spring #Annotation #AOP
+---
+
+# 내용
+
+## Artifact
+- org.aspectj:aspectjrt
+
+## 역할
+- Pointcut 명시
+- JoinPoint 에서 Exception 발생 후 비즈니스 로직 정의
+
+## 특징
+- [@Around](../../aop/AOP-@Around)와 다르게 proceed 호출 없이 로직 수행 후 자동으로 target 메서드를 호출
+
+## 사용법
+
+```java
+@AfterThrowing("execution(* com.mvcvue.controller..*.*(..))")
+public void afterThrowingLogger(JoinPoint joinPoint){
+ System.out.println("afterThrowingLogger");
+}
+```
+
+---
+
+# 연결문서
+- [AOP](../../spring/Spring-AOP)
+- [@Aspect](../../aop/AOP-@Aspect)
+- [Pointcut Designator](../../spring/Spring-Pointcut-Designator)
+- [Advice](../../spring/Spring-Advice)
\ No newline at end of file
diff --git a/_posts/2023-12-22-aop-@Before.md b/_posts/2023-12-22-aop-@Before.md
new file mode 100644
index 0000000..d1c816c
--- /dev/null
+++ b/_posts/2023-12-22-aop-@Before.md
@@ -0,0 +1,46 @@
+---
+title : "@Before"
+excerpt : "@Before"
+toc : true
+toc_sticky : true
+toc_label : "@Before"
+categories:
+- AOP
+tags:
+- [Spring, Annotation, AOP]
+last_modified_at: 2023-12-22T08:00:00-10:00:00
+---
+
+# 날짜 : 2023-12-22 12:34
+
+# 태그 : #Spring #Annotation #AOP
+---
+
+# 내용
+
+## Artifact
+- org.aspectj:aspectjrt
+
+## 역할
+- Pointcut 명시
+- JoinPoint 실행 전처리 비즈니스 로직 정의
+
+## 특징
+- [@Around](../../aop/AOP-@Around)와 다르게 proceed 호출 없이 로직 수행 후 자동으로 target 메서드를 호출
+
+## 사용법
+
+```java
+@Before("execution(* com.mvcvue.controller..*.*(..))")
+public void beforeLogger(JoinPoint joinPoint){
+ System.out.println("beforeLogger");
+}
+```
+
+---
+
+# 연결문서
+- [AOP](../../spring/Spring-AOP)
+- [@Aspect](../../aop/AOP-@Aspect)
+- [Pointcut Designator](../../spring/Spring-Pointcut-Designator)
+- [Advice](../../spring/Spring-Advice)
\ No newline at end of file
diff --git a/assets/images/AOPConcept.png b/assets/images/AOPConcept.png
new file mode 100644
index 0000000..d65fc7f
Binary files /dev/null and b/assets/images/AOPConcept.png differ
diff --git a/assets/images/AdviceAnnotationOrder.png b/assets/images/AdviceAnnotationOrder.png
new file mode 100644
index 0000000..1b4feb6
Binary files /dev/null and b/assets/images/AdviceAnnotationOrder.png differ
diff --git a/assets/images/CallExceptionAPIResult.png b/assets/images/CallExceptionAPIResult.png
new file mode 100644
index 0000000..c5d7d64
Binary files /dev/null and b/assets/images/CallExceptionAPIResult.png differ
diff --git a/assets/images/CallHelloAPIResult.png b/assets/images/CallHelloAPIResult.png
new file mode 100644
index 0000000..796240b
Binary files /dev/null and b/assets/images/CallHelloAPIResult.png differ
diff --git a/assets/images/GitUserAddSSHKey.png b/assets/images/GitUserAddSSHKey.png
new file mode 100644
index 0000000..ccb3796
Binary files /dev/null and b/assets/images/GitUserAddSSHKey.png differ
diff --git a/assets/images/GitUserSetting.png b/assets/images/GitUserSetting.png
new file mode 100644
index 0000000..de0f5e7
Binary files /dev/null and b/assets/images/GitUserSetting.png differ
diff --git a/assets/images/MATOpenHeapDump.png b/assets/images/MATOpenHeapDump.png
new file mode 100644
index 0000000..a489707
Binary files /dev/null and b/assets/images/MATOpenHeapDump.png differ
diff --git a/assets/images/Pasted Image 20231215154232_014.png b/assets/images/Pasted Image 20231215154232_014.png
new file mode 100644
index 0000000..acc806f
Binary files /dev/null and b/assets/images/Pasted Image 20231215154232_014.png differ
diff --git a/assets/images/Pasted Image 20231215154413_953.png b/assets/images/Pasted Image 20231215154413_953.png
new file mode 100644
index 0000000..c67fdb7
Binary files /dev/null and b/assets/images/Pasted Image 20231215154413_953.png differ
diff --git a/assets/images/Pasted Image 20231222105754_957.png b/assets/images/Pasted Image 20231222105754_957.png
new file mode 100644
index 0000000..15e75d3
Binary files /dev/null and b/assets/images/Pasted Image 20231222105754_957.png differ
diff --git a/assets/images/PostManCallExceptionResult.png b/assets/images/PostManCallExceptionResult.png
new file mode 100644
index 0000000..80b011e
Binary files /dev/null and b/assets/images/PostManCallExceptionResult.png differ
diff --git a/assets/images/PostManCallHelloAPI.png b/assets/images/PostManCallHelloAPI.png
new file mode 100644
index 0000000..ae9ffce
Binary files /dev/null and b/assets/images/PostManCallHelloAPI.png differ
diff --git a/assets/images/SetCSS.png b/assets/images/SetCSS.png
new file mode 100644
index 0000000..f4aec64
Binary files /dev/null and b/assets/images/SetCSS.png differ
diff --git a/assets/images/TreeResult.png b/assets/images/TreeResult.png
new file mode 100644
index 0000000..d648bb3
Binary files /dev/null and b/assets/images/TreeResult.png differ
diff --git a/assets/images/WebSocketProcess.png b/assets/images/WebSocketProcess.png
new file mode 100644
index 0000000..7ef5b48
Binary files /dev/null and b/assets/images/WebSocketProcess.png differ