반응형
REST (Representational State Transfer)
설명

자원을 표현(Representational)으로 구분하여 해당 자원의 상태(State)를 주고 받는(Transfer)다.
HTTP URI(Uniform Resource Identifier)을 통해 자원(Resource)을 명시하고, Http Method(GET, POST, PUT, DELETE)을 통해 자원에 대한 CRUD Operation을 적용

✱ URI (Uniform Resource Identifier)
인터넷 자원을 나타내는 유일한 주소
scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]
 - URN: 자원의 이름 (식별자)
 - URL: 자원의 위치 

 

구성요소

1. 자원 (Resource)
‣ Http URI (ex. /users/:userId)

2. 행위 (Method)
‣ GET, POST, PUT, DELETE,
‣ HEAD (요청 header 정보만 응답),
‣ PATCH (PUT과 다르고, 자원의 일부만 수정하고자 할때 사용),
‣ OPTION (현재 End-point가 제공 가능한 API method를 응답)

3. 표현 (Representation of Resource)
  Client(브라우저)가 자원의 상태에 대한 조작을 요청(Request)하면 서버는 이에 적절한 응답(Response)을 보낸다.
  JSON, XML, TEXT, RSS 등 여러 형태로 표현

 

REST API 특징

1. 클라이언트/서버
 아키텍처를 단순화 시키고 작은단위로 분리함으로써
클라이언트 - 서버 각 파트가 독립적으로 개선될 수 있도록 한다. 


2. 상태없음
 클라이언트의 상태가 서버에 저장되어서는 안된다.

3. 레이어드 아키텍처 (Layered Architecture)
 클라이언트 - 서버 연결 사이의 중간 서버가 존재하는 경우 (클라이언트 - 중간서버 - 서버),
중간서버(게이트웨이, 방화벽, 프록시 etc)는 로드밸런싱 혹은 공유 캐시 기능을 제공함으로써
시스템 규모 확장성을 향상시키는데 유용

4. 캐시 (Cache)
 클라이언트 응답을 캐싱할 수 있어야 함. 캐싱함으로서 서버에 부하 최소화

5. 코드 온 디맨드(Code on demand)
 요청이 오면 코드를 준다는 의미로 특정 시점에 서버가 특정 기능을 수행하는 스크립트 또는
플러그인을
클라이언트에 전달해서 해당 기능을 동작하도록 하는것. (자바스크립트, 플래시 etc)

6. 통합 인터페이스
 일관적인 인터페이스로 분리 되어야 함.

 

REST 인터페이스 규칙

1. 리소스 식별
 요청 내에 기술된 개별 자원을 식별할 수 있어야 한다. (URI)

2. 표현을 통한 리소스 처리
 다양한 콘텐츠 유형으로 표현 가능 (JSON, XML, HTML ..)

3. 자기 묘사 메세지
 Http header 에 메타 데이터 정보를 추가해서 실제 데이터와는 관련 없지만
데이터에 대한 설명을 나타내는 정보를 담을 수 있음.

4. 어플리케이션의 상태에 대한 하이퍼미디어(HATEOAS, Hypermedia As The Engine Of Application State)
 REST API 개발할 때에 단순 데이터만 전달하지 않고, 링크 정보까지 포함하여 전달 (하이퍼 텍스트 링크)
 리소스 상태가 전이되는 경우에 변경되는 정보를 제공하고자 함.
(등록 요청 후, 변경 된 정보를 좀 더 자세히 알고자 할때 하이퍼 링크도 같이 제공)
    

 

REST API 
설명

REST 아키텍처의 제약 조건을 준수하는 애플리케이션 프로그래밍 인터페이스

 

RESTful의 목적

API 이용자가 해당 API 으로 데이터를 얻고, 특정 기능을 파악할 수 있도록 하는 것

 

리소스 원형

도큐먼트 (document)
 객체 인스턴스나 데이터베이스 레코드와 유사한 개념

컬렉션 (collection)
 서버에서 관리하는 디렉터리 리소스 

스토어 (store)
 클라이언트에서 관리하는 리소스 저장소
 API 클라이언트가 리소스를 등록/수정/삭제에 관여

컨트롤러 (controller)
 절차적인 개념을 모델화 한 것

 

✰ REST API 디자인을 위한 규칙

추상적인 것 보단, 구체적인 것이 좋다.
ex) /animals -> /pigs

동사를 사용하지 않는다. (명사를 사용)
method 를 동사 대용으로 사용.

단수보단, 복수를 사용하는 것을 권장한다.
ex) /thing  ->  /things or /things/{id}

슬래시(/) 을 사용하여 계층관계를 표시해야 한다.
리소스간 연관관계는 /리소스명/리소스ID/관계가 있는 다른 리소스명 으로 표현한다.

ex) GET /users/{userid}/devices (소유자가 가지고있는 디바이스 목록?)

URL 마지막에 슬래시(/) 을 포함하지 않는다.
슬래시를 포함한다면, 슬래시 다음에 식별자가 와야하는데 오지 않음으로 혼동을 줄 여지가 있음.

URI의 가독성을 높히려면 하이픈(-)을 사용해야 한다.

URI에 밑줄(_)을 사용해선 안된다.
보기가 어려움. 가독성

URI 경로에는 소문자를 사용해야 한다.

파일 확장자는 사용하지 않는다.

 


참고

https://www.redhat.com/ko/topics/api/what-is-a-rest-api

(책) 스프링 부트로 배우는 자바 웹 개발

 

REST API(RESTful API, 레스트풀 API)란 - 서버, 구현, 사용법

REST API(RESTful API)란 REST 아키텍처의 제약 조건을 준수하는 애플리케이션 프로그래밍 인터페이스를 뜻합니다. api 서버, rest api 구현 및 사용법을 설명합니다.

www.redhat.com

https://nsinc.tistory.com/192

 

URL vs URI vs URN

인터넷을 사용하면서 많이 만나게 되는 URI, URL, URN의 개념에 대해서 정리해보고자 합니다. URI, URL, URN은 기술적인 구분이 아닌 개념적인 차이라고 볼 수 있으므로 참고 바랍니다. URI vs URL vs URN ?

nsinc.tistory.com

https://spoqa.github.io/2013/06/11/more-restful-interface.html

 

RESTful API를 설계하기 위한 디자인 팁

RESTful api를 설계하기 위한 개념들을 추가적으로 알아보고 유용하게 쓰일만한 HTTP헤더와 상태코드를 살펴봅니다.

spoqa.github.io

https://dzone.com/articles/7-rules-for-rest-api-uri-design-1

 

7 Rules for REST API URI Design - DZone Integration

URIs, or Uniform Resource Identifiers, should be designed to be readable and clearly communicate the API resource model. These rules will help you succeed.

dzone.com

https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html

 

[Network] REST란? REST API란? RESTful이란? - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

https://www.slideshare.net/nexusz99/rest-api-48600643

 

REST API 디자인 개요

REST API가 무엇이고 그것을 어떻게 디자인해야하는지에 대해 나름대로 정리를 해보았습니다.

www.slideshare.net

https://zsgg.tistory.com/entry/REST-API-%EB%94%94%EC%9E%90%EC%9D%B8-%EA%B7%9C%EC%B9%99

 

REST API 디자인 규칙

여전히 우리는 다음과 같은 질문들에 대한 답을 찾아야 한다. URI 경로path 세그먼트는 언제 복수로 써야 하는가? 리소스의 상태를 업데이트하려면, 어떤 메서드를 사용해야 하는가? CRUD12가 아닌

zsgg.tistory.com

https://sanghaklee.tistory.com/57

 

RESTful API 설계 가이드

1. RESTful API 설계 가이드 본 문서는 REST API를 좀 더 RESTful 하게 설계하도록 가이드할 목적으로 만들어졌다. 따라서, 기본적인 REST API 개념 설명은 아래의 링크로 대신한다. REST API 제대로 알고 사용

sanghaklee.tistory.com

https://meetup.toast.com/posts/92

 

REST API 제대로 알고 사용하기 : NHN Cloud Meetup

REST API 제대로 알고 사용하기

meetup.toast.com

 

반응형

'개발 > etc' 카테고리의 다른 글

SSE (Server Sent Event)  (1) 2023.08.20
Vault  (1) 2023.02.07
헥사고날 아키텍처 (Hexagonal Architecture)  (2) 2022.09.25
JWT (JSON WEB TOKEN)  (0) 2021.12.22
HTTP관련 (https, spdy, ajax, websocket)  (0) 2018.12.09
반응형
DI
설명

의존성 주입이라고도 하며, IoC (Inversion of Control) 라고 하는 소프트웨어 디자인 패턴 중 하나.
어떤 클래스가 필요로 하는 컴포넌트를 외부에서 생성한 후, 내부에서 사용 가능하게 만들어 주는 과정

DI 컨테이너를 통해 각 컴포넌트의 인스턴스를 생성하고 통합 관리하면서 컴포넌트간 의존성 문제를 해결할 수 있다.

✳︎ 빈 (@bean)
spring DI container에 의해 관리되는 객체 
ApplicationContext.getBean(XXX.class) 으로 얻어지는 객체를 의미


✳︎ 컴포넌트 (@Component)
사용자가 만든 bean 을 자동으로 감지할 수 있도록 한 것


✳︎ IoC 컨테이너 (Inversion of Control)
의존성 주입을 자동으로 처리하는 기반이고 인스턴스 구성 및 빈 조립을 담당한다.
빈 팩토리(Bean Factory)라고도 함.
Bean Factory에 여러가지 컨테이너 기능을 추가하여 ApplicationContext라고 부름. (Bean Factory의 확장)


✳︎ Bean Factory
Bean 을 등록/생성/조화/반환 관리함.


✳︎ ApplicationContext
spring bean을 보유하고있는곳
Bean Factory 와 기능 같고, Spring의 부가 서비스를 추가로 제공


어떤 컴포넌트는 싱글턴(singleton) 객체로 만들어야 하며, 어떤 컴포넌트는 프로토타입(prototype) 객체로 만들어야 한다. 이러한 인스턴스 스코프(scope) 관리를 DI 컨테이너가 대신 해준다.

 

DI 방법 3가지

1. 설정자 기반 (setter-based)
  setter method 에 @Autowired 을 적용

@RestController
public class AController {
    private A a;

    @Autowired
    public void setA(A a) {
	    this.a = a;
    }
}


2. 생성자 기반 (contructor-based)
  생성자 인수를 사용해 의존성을 주입하는 방식

@RestController
public class AController {
    private final A a;
    
    public AController(A a){
        this.a = a;
    }
}

 

3. 필드기반 (field-based)
  사용하고 싶은 필드에 @Autowired 을 적용 

@RestController
public class AController {
    
    @Autowired
    private A a;
}

 

✳︎ @Autowired
빈을 자동으로 주입하는 방식

 

필드 기반 방식은 추천하지 않는다. (생성자 방식으로 사용하는것을 권장)
추천하지 않는 이유는 순환참조 때문! 

✳︎ 순환참조
서로 다른 클래스가 서로를 참조하고 있는 상태, 따라서 스프링 컨테이너가 어떤 빈을 먼저 생성해야할지 판단을 하지 못해서 발생하는 문제!

생성자 방식을 추천하는 이유는 테스트 코드 작성에 용의하며, 실행 중 객체가 변경되는 것을 방지할 수 있다.
  

 

DI 컨테이너 사용의 장점
장점

  인스턴스 스코프 제어
  인스턴스 생명주기 제어
  AOP 방식으로 공통기능 적용 가능
  의존하는 컴포넌트 간의 결합도를 낮춰 단위테스트 쉽게 가능

 

 

빈 설정 방법
설정 방법 3가지

1. 자바 기반 설정 방식 (Java-based configuration)
  - 자바 클래스에 @Configuration, 메소드에 @Bean 을 사용해 빈을 정의하는 방법

2. XML 기반 설정 반식 (XML-based configuration)
  - XML 파일을 사용하는 방법 (<bean>, <constructor-arg>, <property>)

3. 애너테이션 기반 설정 방식 (Annotation-based configuration)
  - @Component 같은 마커 어노테이션이 부여된 클래스를 탐색해서(Component Scan) IoC컨테이너에 빈을 자동으로 등록하는 방법.

 

 

컴포넌트 스캔 (Component Scan)
설명

클래스 로더(Class Loader)를 스캔하면서 특정 클래스를 찾은 다음, DI 컨테이너에 등록하는 방법

 

종류

@Component, @Controller, @Service, @Repository, @Configuration, @RestController, @ControllerAdvice, @ManagedBean, @Named ..

 

 


참고

(책) 스프링 철저 입문
http://blog.naver.com/PostView.nhn?blogId=gngh0101&logNo=221179100057&parentCategoryNo=&categoryNo=32&viewDate=&isShowPopularPosts=false&from=postView
https://dog-developers.tistory.com/12
https://ict-nroo.tistory.com/120
https://www.baeldung.com/spring-component-annotation
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-basics

반응형

'개발 > spring' 카테고리의 다른 글

트랜잭션  (0) 2021.11.25
Spring - 스프링 MVC 간단 정리  (0) 2021.06.05
Spring - AOP(Aspect-Oriented Programming)  (0) 2021.05.25
IOC/DI, DI응용  (0) 2017.11.20
spring 시작, maven 설치  (0) 2017.11.12
반응형
상황

H2 db 사용, entity class 에 테이블명을 명시해주지 않음. 
데이터 등록 처리 중 해당 에러 발생 (테이블 시퀀스 값이 없다는 상황)

 

해결

entity class (@Entity 설정 클래스) 내 id 필드(@Id 설정된 값)의
@GeneratedValue(strategy = GenerationType.AUTO) 설정 부분을
@GeneratedValue(strategy = GenerationType.IDENTITY) 으로 변경
    --> 기본키 생성을 데이터베이스에 위임해주고 id가 null 이면 알아서 auto_increment 해줌


참고

https://stackoverflow.com/questions/39807483/sequence-hibernate-sequence-not-found-sql-statement

 

Sequence "HIBERNATE_SEQUENCE" not found; SQL statement

In my spring mvc app, i have the following object. I am trying to make a visual of data using devtool in my app. @Entity @Data public class ConsultationRequest { @Id @GeneratedValue p...

stackoverflow.com

https://gmlwjd9405.github.io/2019/08/12/primary-key-mapping.html

반응형
반응형

람다

설명

익명함수다. 익명함수 즉, 코드 블럭이다.
코드 블럭은 메소드 내에 존재해야 한다!

※ 익명함수

재사용 가능한 기능의 일부분을 전달하고 싶을때 사용하는것.
함수들에 함수를 인자로 전달하는 경우 (콜백?)

 

코드예시
//기본 문법 
(args) -> {
	//블라블라
}
/* 
ASIS: 람다는 타입 지시자(Integer)를 생략할 수 있다 

함수형 인터페이스가 타입을 설명하고 있어, 
컴파일러가 필요한 모든 정보를 제공해줄 수 있기 때문이다.
*/
(Intefer x) -> x + 1; 

// TOBE: 이렇게!
(x) -> x + 1 


//ASIS: 매개변수 하나인 인터페이스 메소드 을
(x) -> x + 1 

// TOBE: 이렇게 표현 가능
x -> x + 1
// ASIS: 익명클래스 일반적 사용
void annoymousClass() {
	final Server server = new HttpServer();
	waitFor(new Condition() {
		
		@Override
		public Boolean isSatisfied() {
			return !server.isRunning();
		}
	});
}

// TOBE: 람다 사용 - 클로저지만 람다다.
void Closure() {
	Server server = new HttpServer();
	waitFor(() -> !server.isRunning());
}	


// (별도) WaitFor 클래스 
class WaitFor {
	static void waitFor(Condition condition) throws
	InterruptedException {
		While (!condition.isSatisfied())
			Thread.sleep(250);
	}
}
public class LambdaStudy {
    private String firstName = "Jack";
    public void 람다가_firstName_에_직접_접근() {
        Function<String, String> addSurname = surname -> {
          
          // 람다가 firstName 변수에 직접 접근이 가능. (필드,메소드,지역변수에 접근 가능)
          return this.firstName + " " + surname; 
        };
    }
}

 

람다가 도입된 이유

설명

빅데이터를 다루기 위해 멀티코어를 활용한 분산처리, 즉 병렬화 기술이 필요 하였음.
그래서 java8 에서는 병렬화를 위해 배열, List, Set, Map을 강화하였고 스트림을 강화 하였다.
그리고 스트림을 효율적으로 사용하기 위해 함수형 프로그래밍, 함수형 프로그래밍을 위해 람다,
람다를 위해 인터페이스 변화가 수반 되었다.

빅데이터 지원 → 병렬화 강화 → 컬렉션 강화 → 스트림 강화 → 람다 도입 → 인터페이스 명세 변경 → 함수형 인터페이스 도입

 

람다의 장/단점

장점

코드가 간결하다. 개발자의 의도를 쉽게 파악할 수 있다.
병렬 처리에 유리함.
함수를 만드는 시간을 덜 들일 수 있다.

단점

코드 남용시 디버깅이 힘들 수 있다.
재귀 로직 만드는것은 어렵다.

 

메소드 참조

설명

메소드 참조를 람다로서 사용할 때엔 이미 존재하는 이름을 가진 메소드를 가리키는 것인데, 그것은 이미 몸체를 가지고 있다.
일반 메소드를 함수형 인터페이스로 전환하는 행동.

※ 함수형 인터페이스 (@FunctionalInterfate)

함수형 메소드 or SAM(단일 추상 메소드)
하나의 인터페이스에 하나의 메소드만 가질 수 있음.
부모의 함수형 메소드 오버라이드 가능
@FunctionalInterface
interface A {
	abstract void apply();
}

// 가능
interface B extends A {
	
	@Override
	abstract void apply();
} 

// 불가능
interface B extends A {
	
	@Override
	abstract void illegal();
} 

 

메소드 참조의 특징

쌍콜론(::)의 앞부분은 대상으로 하는 클래스명, 뒷부분은 메소드명
method 뒤에 소괄호()을 쓰지 않는다.

메소드 참조의 유형

생성자 참조 (String::new)
  쌍콜론 뒤에 new가 붙음

  String 클래스의 인자없는 생성자를 호출하는 람다를 생성
  () → new String() 과 같은 의미

정적 메소드 참조 (String::valueOf)
  x → String.valueOf(x)

두 가지 유형이 인스턴스 메소드 참조 (x::toString)
  x는 접근 가능한 특정 인스턴스라 가정

  () → x.toString()

 

 

람다의 예외 처리

설명

람다는 예외처리를 위한 새로운 문법이 존재하지 않음.
람다에서 던져진 예외들은 일반 메소드 호출과 동일하게 호출한 곳으로 전파 된다.
즉, 람다를 호출하는 메소드에서 어떻게 실행될지에 대해 책임을 지지 않음. 람다는 병렬 또는 미래의 어느 시점에 처리될 수도 있기 때문.
예외처리가 가능하도록 로직을 만들수는 있지만 코드가 장황해진다.

비지니스 로직 < 에러 처리 위한 보일러 플레이트 코드

 

 

함수와 클래스

설명

클래스는 인스턴스화가 되어야 함. 함수는 그렇지 않음.
클래스는 새로 생성되면 객체를 위해 메모리가 할당됨.
함수를 위한 메모리는 딱 한번 할당 됨. (자바 힙의 퍼머넌트(permanent)영역에 저장 됨.
객체는 자신만의 데이터를 가지지만 함수는 데이터와 연관 관계가 없다.
자바 클래스의 정적 메소드는 함수와 거의 유사하다.

 


참고

(책) 자바 람다 배우기
(책) 스프링 입문을 위한 자바 객체지향의 원리와 이해
https://coding-factory.tistory.com/265

반응형

'개발 > java' 카테고리의 다른 글

WebClient 사용시 주의할점!  (0) 2023.08.13
[RxJava] 리액티브 프로그래밍  (0) 2022.05.02
java - call by value, call by reference  (0) 2021.07.11
프로세스 / 스레드  (0) 2021.05.26
jdbc, mybatis, jpa  (0) 2018.12.31
반응형

프로세스

설명

실행중인 프로그램

※ 멀티 프로세스

다수의 데이터 저장 영역을 가짐 (다수의 T메모리를 가지는 구조)
프로세스 끼리 서로 참조 불가능 (공간 영역 자체가 분리)

 

스레드

설명

하나의 프로그램 내 여러개의 실행 흐름

※ 멀티 스레드
T메모리 모델(스태틱, 스택, 힙)의 스택 영역(메소드 영역)을 스레드 갯수 만큼 분할해서 사용하는 것.
서로 다른 스레드의 스택 영역은 접근 못하지만 스태틱영역, 힙 영역은 공유해서 사용하는 구조.
멀티 프로세스 대비 메모리를 적게 사용하는 구조.!!
전역 변수 사용시 문제가 될 가능성 존재 ((변수참조)락을 거는 방법이 있다고 함 (?))

 

스레드풀

스레드 풀은 작업처리에 사용되는 스레드를 제한된 개수만큼 정해놓고 작업큐 (Queue)에 들어오는 작업들을 하나씩 스레드가 맡아 처리.
정해진 큐에 들어온 작업을 하나씩 처리하기때문에, 요청이 늘어나도 전체 큐 갯수는 늘어나지 않기 때문에 성능이 급격히 저하되지 않음.

ExecutorService

ExecutorService는 스레드에서 비동기 적으로 작업을 실행할 수있는 인터페이스.
java.util.concurrent 패키지에 있고, 스레드 풀을 유지 관리하고 작업을 할당하는 데 도움이된다. 
또한 작업 수가 사용 가능한 스레드보다 많을 경우 사용 가능한 스레드가있을 때까지 작업을 대기열에 넣는 기능을 제공한다.

 

 

Fork Join Framework

병렬화 할 수 있는 작업을 재귀적으로 작은 작업으로 분할 후 서브태스크에 각각의 결과를 합쳐전체 결과를 만듬

Fork: 데이터 반복적으로 분리
Join: 서브 결과를 결합하여 최종 결과를 만듬

 

 

프로세스와 스레드의 차이

설명

프로세스는 메모리 영역을 공유하며, 스레드는 스택영역을 생성함

 


참고

https://wikibook.co.kr/java-oop-for-spring/ (책: 스프링 입문을 위한 자바 객체지향의 원리와 이해)
https://3dmpengines.tistory.com/2003

https://www.javatpoint.com/java-executorservice

 

프로세스&쓰레드와 메모리(스택, 레지스터)

Thread란 하나의 프로그램내에서 여러 개의 실행 흐름을 두기 위한 모델 하나의 프로세서(실행 중인 프로그램)에서 각 독립적인 일의 단위인 스레드(Thread)로 여러 작업을 처리할 수 있다. 즉 하

3dmpengines.tistory.com

https://cheershennah.tistory.com/170

https://www.geeksforgeeks.org/thread-pools-java/

https://black9p.github.io/2018/01/20/병렬-데이터-처리와-성능/

반응형

'개발 > java' 카테고리의 다른 글

WebClient 사용시 주의할점!  (0) 2023.08.13
[RxJava] 리액티브 프로그래밍  (0) 2022.05.02
java - call by value, call by reference  (0) 2021.07.11
자바-람다(lambda)  (0) 2021.05.28
jdbc, mybatis, jpa  (0) 2018.12.31
반응형
AOP (Aspect-Oriented Programming)
설명

여러 로직단에 적용되어야 할 특정 중복 로직을 여러 코드를 수정하지 않고 적용하는 것
흩어진 코드를 한곳으로 모으자!
횡단 관심에 따라 프로그래밍 하는것

※ 횡단
동서 방향으로 가로질러 가는것
※ 횡단 관심사 (Cross cutting concern)

다수의 모듈에 공통적으로 나타나는 부분이 존재
모듈별로 반복되어 중복해서 나타나는 부분반복과 중복은 분리하여 한곳에서 표현해야 한다라는것을 항상 인지해야 함.
특징

Aspect 으로 표현
로직(Code) 주입
로깅, 보안, 트랜잭션 기능이 반복적으로 나타남
AOP는 프록시 기반, 인터페이스 기반, 런타임 기반 이다.

 

메소드에 주입할 수 있는 영역

@Before: 대상 메소드 시작 전
@After: 대상 메소드 시작 후
    @AfterReturning: 대상 메소드 정상 종료 후 
    @AfterThrowing: 대상 메소드 예외 발생 → 종료 후

 

AOP 용어
Aspect 여러개의 Advice, 여러개의 Pointcut의 결합체를 의미하는 용어
Advisor 한개의 Advice, 한개의 Pointcut
Advice pointcut에 적용할 로직, 즉 메서드를 의미 

@Before("execution( * runSomething())") 
public void before(JoinPoint joinPoint) { ... }
JoinPoint 연결점. 연결 가능한 지점. Aspect 적용 가능 지점. 스프링 프레임워크가 관리하는 빈의 모든 메서드

public void before(JoinPoint joinPoint) { ... }
Pointcut 자르는 지점, Aspect 적용 위치 지정자. 횡단 관심사를 적용할 타깃 메서드를 선택하는 지시자.

@Before("execution( * runSomething())") → runSomething() 실행 전 AOP을 실행하라는 뜻

 

Pointcut 지정자 관련

 
  execution

일치하는 메서드 실행 조인 포인트에 사용됩니다. 이것은 Spring AOP로 작업 할 때 사용하는 주요 포인트 컷 지정자입니다.

  within
특정 유형 내 결합 점에 대한 매칭을 제한합니다 (Spring AOP 사용시 매칭 유형 내에서 선언 된 메소드 실행).

  this
빈 참조 (Spring AOP 프록시)가 주어진 유형의 인스턴스 인 조인 포인트 (Spring AOP 사용시 메소드 실행)에 대한 매칭을 제한합니다.

  target
대상 객체 (프록시되는 애플리케이션 객체)가 주어진 유형의 인스턴스 인 조인 포인트 (Spring AOP 사용시 메서드 실행)에 대한 매칭을 제한합니다.

  args
인수가 주어진 유형의 인스턴스 인 조인 포인트 (Spring AOP 사용시 메서드 실행)에 대한 매칭을 제한합니다.

  @target
실행 객체의 클래스가 주어진 타입의 어노테이션을 가지고있는 join point (Spring AOP 사용시 메소드 실행)로 매칭을 제한합니다.

  @args
전달 된 실제 인수의 런타임 유형이 주어진 유형의 어노테이션을 갖는 결합 지점 (Spring AOP 사용시 메소드 실행)에 대한 일치를 제한합니다.

  @within
주어진 어노테이션 (Spring AOP를 사용할 때 주어진 어노테이션이있는 타입에서 선언 된 메소드의 실행)이있는 타입 내에서 조인 포인트에 대한 매칭을 제한합니다.

  @annotation
Join point의 주제 (Spring AOP에서 실행되는 메소드)가 주어진 어노테이션을 가지고있는 join point로 매칭을 제한합니다.

 

Pointcut 표현식 예제

 
  모든 공용 메소드 실행

execution(public * * (..))

  다음으로 시작하는 이름을 가진 모든 메소드의 실행 
setexecution(* set * (..))

  AccountService인터페이스에 의해 정의 된 모든 메소드의 실행 
execution(* com.xyz.service.AccountService. * (..))

  service패키지에 정의 된 모든 메소드 실행 
execution(* com.xyz.service. *. * (..))

  서비스 패키지 또는 하위 패키지 중 하나에 정의 된 모든 메서드 실행
execution(* com.xyz.service .. *. * (..))

  서비스 패키지 내의 모든 조인 포인트 (Spring AOP에서만 메서드 실행)
within(com.xyz.service. *)

 서비스 패키지 또는 하위 패키지 중 하나 내의 모든 조인 지점 (Spring AOP에서만 메서드 실행)
within(com.xyz.service .. *)

  프록시가 AccountService인터페이스를 구현하는 모든 조인 포인트 (Spring AOP에서만 메서드 실행) 
this(com.xyz.service.AccountService)

 


 

참고


https://wikibook.co.kr/java-oop-for-spring/ (책: 스프링 입문을 위한 자바 객체지향의 원리와 이해)
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop

 

반응형

'개발 > spring' 카테고리의 다른 글

트랜잭션  (0) 2021.11.25
Spring - 스프링 MVC 간단 정리  (0) 2021.06.05
Spring - DI (Dependency Injection)  (0) 2021.06.01
IOC/DI, DI응용  (0) 2017.11.20
spring 시작, maven 설치  (0) 2017.11.12
반응형
  • Blocking : 다음 순서를 기다림. 기다리는 동안 아무것도 못함.
  • Non-blocking : 다음 순서를 기다리지 않고(결과받음) 그 다음을 실행.
  • Synchronous : 요청에 대한 결과값을 요청한 주체가 인지함. (요청에 대한 결과 시간과 다음 요청시간이 동일).
  • Asynchronous : 요청에 대한 결과값을 요청한 주체가 인지하지 않고, 결과를 주는 곳에서 따로 확인

 

- 참고

 

http://wiki.sys4u.co.kr/pages/viewpage.action?pageId=7767390

페이지 PLATEER OPEN WIKI 기타등등 배너의 맨 끝으로 배너의 맨 처음으로 메타 데이터의 끝으로 건너뛰기 알 수 없는 사용자 (sonnsk87)님이 작성, 1월 17, 2018에 최종 변경 메타 데이터의 시작으로 이동

wiki.sys4u.co.kr

juneyr.dev/reactive-programming

반응형
반응형

프론트에서 보내지 않은 파라미터 값을 서버에서 받으려고 할때 발생.

 

@RequestParam의 required 여부 확인

ex. @RequestParam(value=“param”, required=false) MultipartFile param ....

정의하면 param 을 null 받을 있다.

 

+ MultipartFile[]의 경우는 프론트에서 값을 안넘기더라도

기본 주소(null 이 아닌 기본 길이 0)가 존재하여 해당상황 발생 안함!

반응형
반응형

사용중인 포트 확인필요 -> 포트를 죽이세요.

$ lost -I :포트번호
COMMAND   PID       USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
java    24496 xxx   6u  IPv6 xxxx     0t0  TCP *:http-alt (LISTEN)

$ kill -9 PID (PID는 24496)

 

반응형
반응형

Lombok플러그인을 설치 하였는지 확인하기!

(pom.xml으로 불러온다고 끝이 아니였다)

 

Help > Find Action > Plugins 검색 > Marketplace단에서 Lombok 검색하여 설치

 

반응형

+ Recent posts