✨KB IT's Your Life✨ 5기 TIL 기자단 활동
KB IT's Your Life 5기에서 학습한 내용을 복습하고자 정리한 글
기간: 8/18 ~ 8/25
학습 내용: Spring 활용 - REST, AOP, Spring WebSocket

REST(REpresentational State Transfer)

Representational: 리소스의 표현을 전송한다는 의미(주소)
State: 리소스의 상태를 주고받는다는 의미
Transfer: 클라이언트와 서버 간 상태 정보를 주고받는다는 의미

웹 서비스 디자인 아키텍처 중 하나로 네트워크의 리소스를 정의하고, 이 리소스에 대한 주소(URL)를 지정하여 상태를 전송하는 방법을 제공한다는 개념

주소를 가지고 내가 원하는 자원을 명확하게 요청 가능!

REST 핵심 개념

자원(Resource)

모든 것이 자원(특정 데이터나 정보)으로 간주

URI(Uniform Resource Identifier)를 통해 식별

표현(Representation)

자원의 현재 상태는 XML, JSON, HTML 등 다양한 형식으로 표현

상태 전이(State Transfer)

클라이언트와 서버 간 자원의 상태를 주고받으며, 클라이언트가 서버에 요청을 보내면 서버는 자원의 상태를 전달

HTTP 메소드

REST는 주로 HTTP 프로토콜 사용

  • GET: 자원 조회
  • POST: 자원 생성
  • PUT: 자원 업데이트
  • DELETE: 자원 삭제

무상태(Stateless)

각 요청은 독립적

서버는 요청 간 상태 유지 X (쿠키, 세션 등으로 기억)
→ 각 요청에는 필요한 모든 정보가 포함되어야 함

Idempotency(멱등성)

여러 번 실행해도 결과가 동일한 연산의 특성

같은 표현과(=같은 주소로) 같은 상태 요청했을 때 내부적으로 항상 동일하게 처리되어야 함

HATEOAS(Hypermedia As The Engine of Application State)

클라이언트가 동적으로 서버에서 제공하는 링크 따라서 자원에 접근하거나 상태 변경할수 있게 함

Client-Server Architecture

클라이언트와 서버가 서로 독립적으로 개발되고 배포될 수 있는 구조

  • 클라이언트: 사용자 인터페이스와 관련된 작업 수행
  • 서버: 데이터 저장 및 처리 담당

REST를 사용하는 이유

단순성

  • HTTP 프로토콜 기반이기 때문에 기존 웹 기술과 잘 통합

확장성

  • RESTful 서비스는 쉽게 확장가능, 클라이언트와 서버가 독립적으로 개발

유연성

  • 다양한 데이터 형식 사용가능 = 유연한 데이터 전송 가능

표준화

  • HTTP 표준 따르기 때문에 다양한 클라이언트와 쉽게 상호작용 가능

REST API와 RESTful API

REST API

REST 원칙을 따르는 애플리케이션 프로그래밍 인터페이스를 의미

RESTful API 보다 추상적이고 일반적인 개념

RESTful API

REST 원칙을 따르는 애플리케이션을 구현하는 방식에 대한 구체적인 지침

REST API의 구현을 통해 일관된 인터페이스 제공 목표로 함

  • 자원 기반 접근
  • HTTP 메서드 사용
  • 표현 형식
  • HATEOAS

⇒ REST API의 구현 세부 사항을 명확하게 따르는 것을 의미하는게 RESTful API


AOP(Aspect-Oriented Programming)

AOP란?

프로그램에서 핵심 기능과 공통 기능을 분리하여 관리할 수 있게 하는 프로그래밍

페이지의 구성을 핵심 기능공통 기능 두 가지 관점(Aspect)으로 나눠서 구현

  • 특정 페이지에서 구현되어야 하는 핵심 기능과, 여러 페이지에서 공통으로 나타나는 기능분리
  • 공통적으로 사용되는 기능은 하나의 클래스 파일(=관점(Aspect) 클래스)로 모아두었다가, 실행 시 필요한 곳에 끼워넣는 방식 사용

Aspect(관점)

  • 핵심 기능(핵심 관점): 특정 페이지에서 핵심적인 기능
  • 부가 기능(공통 관점): 핵심적인 기능 중간에 삽입되는 기능(횡단 관심사)

부가적 기능 가진 클래스 = 관점 클래스(예: 로그인/로그아웃)

실행 시 핵심 관점 사이에 공통 관점을 끼워넣음

OOP와 AOP 비교

OOP - 클래스(객체) 기반으로 프로그램 구성
AOP - 클래스(객체) 내의 특정 메서드 기반으로 프로그램 구성
→ 핵심 관점과 부가 관점으로 구분하여 프로그래밍

Spring AOP에서 Proxy 동작 방식

Spring에서는 AOP를 보다 쉽게하기 위한 기능들을 제공하고 있다!

AOP → 설정만 해두면 개발자 대신해서 설정해둔 시점에 호출

Spring AOP는 대표적인 Proxy 패턴 적용 예제!

프록시 생성

@Aspect로 정의된 클래스 바탕으로 프록시 객체 생성

해당 프록시 객체는 타겟 객체의 메서드 호출 전에 advice 적용

프록시 종류

  • JDK 동적 프록시: 인터페이스 기반으로 프록시 생성
    • 타겟 객체에 인터페이스 구현되어있는 경우 Spring은 기본적으로 JDK 동적 프록시 사용
  • CGLIB 프록시: 타겟 객체가 인터페이스 구현하지 않은 경우 CGLIB(Code Generation Library)를 사용하여 프록시 객체 생성
    • 타겟 클래스의 서브클래스 생성하고 메서드 오버라이드하여 advice 적용

프록시 실행

클라이언트가 타겟 객체의 메서드 호출 = 프록시 객체의 메서드가 호출
→ 프록시 객체는 요청을 가로채고 정의된 Advice(@Before, @After, @Around)를 실행한 뒤 실제 타겟 객체의 메서드 호출

클라이언트는 타겟 객체 메서드만 호출하는 점 유의!

Advice 적용

프록시는 메서드 호출 전/후에 advice를 적용하거나 메서드 실행을 제어

애플리케이션의 핵심 로직에 영향을 주지 않고 횡단 관심사를 쉽게 추가 가능
→ 유지보수 측면에서 편리

Advice in AOP

AOP에서의 Advice: 특정 메소드가 호출될 때 실행되는 부가적인 행동을 정의하는 것

Before

대상 메소드가 실행되기 전에 실행되는 Advice

로깅, 유효성 검사시 사용

After

대상 메소드 정상적으로 실행된 후에 실행되는 Advice

메소드 완료된 후 리소스 정리 및 로깅 시 유용

After Running

메소드가 실행된 후 정상적으로 종료되었을 때 실행되는 Advice

메소드의 실행 결과를 바탕으로 추가적인 작업 수행시 사용

After와 After Running의 차이점

After: 정상적으로 종료되지 않은 경우에도 실행
After Running: 정상적으로 종료되지 않은 경우에는 실행 X

Around

메소드 실행 전/후 모두 실행되는 Advice

메소드 실행 자체 제어 가능, 메소드 실행 전후에 필요한 로직 삽입 가능

⇒ 주로 성능체크에서 사용

After Throwing

메소드 실행 중 예외가 발생했을 때 실행되는 Advice

예외 처리 로직 통합 관리하기 위해 사용

에러 발생했을 때 특정 메서드 weaving해서 호출

AOP 조립 과정

수직 - 핵심 관점
수평 - 공통 관점(횡단 관심사)
→ 직조 과정에서 용어 따와서 weaving이라고 칭함

여러가지 메소드 합해서 돌아가는 것 → Join 이라고 부름

어떤 포인트에 어떤 메소드 부를지 포인트 결정 가능

이러한 포인트를 Join Point라고 함

Join Point에 해당하는 핵심 기능 호출 전후로 공통 기능 메소드 끼워넣을 수 있음

Join Point의 대상이 되는 클래스 = 타겟 객체

aopconfig.png

@Pointcut 어노테이션으로 특정 메소드가 호출되는 시점을 설정(어디에 끼워넣을지 설정)

@Pointcut(”execution(* com.multi.spring2.aop.controller.AOPController.aop*(..))”)

메소드는 이름, 입력 파라미터, 반환값 필요

이름 = com.multi.spring2.aop.controller.AOPController.aop* = java 하위의 root 패키지명부터 작성 필요

가장 처음 * = 와일드카드 = 반환 값 타입 어떤 게 와도 상관 X

.. → 입력 파라미터 개수 상관 X(AOP 문법)

언제 호출? 실행시에 = execution

pointcut 정의한 메소드 가지고

해당 메소드 전에 끼워넣어라 = @Before

해당 메소드 후에 끼워넣어라 = @After

클래스 싱글톤으로 생성 → @Component

Spring 안에서 AOP 활용

  • 트랜잭션 관리
  • 보안 검사
  • 성능 모니터링 등

금융권에서의 AOP 활용

인증 및 권한 부여

금융 서비스의 특정한 요청하기 전에 AOP를 통해 사용자의 인증 정보를 검증, 권한이 없는 사용자의 접근을 막는 로직을 자동으로 처리

트랜잭션 관리

트랜잭션 단위로 커밋, 롤백 처리

로깅/감사 로그

특정 처리와 관련해서 로깅/감사 로그 기록

→ 특히 고객의 모든 중요한 행동을 추적하는 감사로그가 금융 기관에서는 굉장히 중요한 작업

시스템의 성능 측정 및 특정 메서드의 실행시간 자동 기록에도 AOP를 활용한다!


Spring WebSocket

스프링 프레임워크에서 웹 소켓 프로토콜을 지원하는 모듈

STOMP와 SockJS 통해서 무리없이 양방향 통신 가능

주요 특징

  • 양방향 통신 클라이언트와 서버가 서로 메세지 주고받는게 가능 → 실시간 애플리케이션에서 매우 유용
  • STOMP 지원 STOMP 프로토콜을 통해 메세지 브로커와 통합 가능한 기능 제공
  • SockJS 지원 웹 소켓 지원하지 않는 브라우저 및 네트워크 환경에서 대체 가능한 폴백 메커니즘으로 SockJS를 제공
  • STOMP 통한 메세지 라우팅 특정 주제(Topic)나 큐(Queue)로 메세지 라우팅

💡 웹 소켓이란?

TCP 기반의 프로토콜
클라이언트와 서버 간 양방향 통신 지원

브라우저와 브라우저 간 채팅 → 브라우저가 직접 통신하는 건 X

중간에 사이트 서버가 존재하고, 브라우저 ↔ 서버 ↔ 브라우저 형태로 통신

서버가 일종의 브로커 역할

⇒ 구현 쉽지 않다

단체 채팅방

특정 브라우저에서 작성한 채팅 해당 채팅방에 들어와있는 모든 브라우저에게 전송되어야 함

마찬가지로 서버 통해서 통신하는 것

어떤 채팅방에 누가 멤버로 있는지 기록 가지고 있어야 함

서버에서는 해당 채팅방에 누가 메세지 보냈는지 정보 받아서 해당 채팅방 멤버에게 전달해줘야 함 = BroadCasting

→ 데이터 보낼 때 작성한 메세지만 보내는 게 아닌 누가 언제 작성한 메세지인지 같이 전달

묶어서 전달 필요 = 자바 구현시에는 key-value형태로 만들어서 VO, DTO에 넣어서 전달

클라이언트 환경에 맞게 출력되도록 서버에서는 데이터만 전송

→ 일반적으로 많이 사용되는 key-value 형태의 데이터가 json

모든 브라우저가 웹소켓 통신 지원 X

웹소켓 지원하는 라이브러리 브라우저에서 필요

→ 웹소켓 = 동적 기능 = JS 라이브러리 이용해서 적용(SockJS)

STOMP 라이브러리 통해서 채팅방에 들어와있는 브라우저 생존 여부 확인, 각 웹소켓별 필요한 기능 메서드로 제공

STOMP(Simple/Streaming Text Oriented Messaging Protocol)

텍스트 기반 메세징 프로토콜

웹 소켓 프로토콜 위에서 사용

클라이언트와 메세지 브로커 간 통신을 위한 규약 정의

메세징에 특화된 프로토콜

주요 특징

  • 프레임 구조 프레임이라는 단위로 메세지 전송
  • 텍스트 기반 모든 메세지가 텍스트 형태로 전송되며, 간단하고 읽기 쉬운 형식
  • 브로커 지원 메세지 브로커(ActiveMQ, RabbitMQ)와의 통신 지원 메세지: 클라이언트 → 브로커 → 구독자 전달 클라이언트는 브로커에게 메세지를 보내고, 브로커는 이를 적절한 구독자에게 전달

주요 프레임

  • CONNECT
    • 클라이언트가 서버(브로커)와 연결 시작할 때 사용
    • 클라이언트: 서버에 연결 요청
    • 서버: CONNECTED 프레임을 응답
    • 주요 헤더
      • accept-version: 클라이언트가 지원하는 STOMP 버전
      • host: 클라이언트가 연결하고자 하는 브로커의 호스트 이름
      • login: 브로커에 접속하기 위한 사용자 이름(선택적)
      • passcode: 브로커에 접속하기 위한 사용자 비밀번호(선택적)
  • SEND
    • 클라이언트가 브로커를 통해 특정 대기열(queue)이나 주제(topic)로 메세지를 보낼 때 사용
    • 메세지는 해당 목적지로 라우팅되어, 구독자(subscriber)에게 전달
    • 주요 헤더
      • destination: 메세지가 전송될 목적지(queue 또는 topic)
      • content-type: 메세지의 MIME 타입(선택적)
      • content-length: 메세지의 길이(선택적)
  • SUBSCRIBE
    • 클라이언트가 특정 대기열(queue)이나 주제(topic)를 구독하여, 해당 목적지로 전송된 메세지를 수신하고자할 때 사용
    • 특정 목적지를 지정하고, 해당 목적지로 전송된 모든 메세지를 수신
    • 주요 헤더
      • destination: 구독하려는 queue 또는 topic의 이름
      • id: 구독을 식별하기 위한 고유 ID. 동일 연결에서 여러 구독을 구분할 때 사용
      • ack: 메세지 확인 모드(선택적)
  • UNSUBSCRIBE
    • 클라이언트가 특정 목적지에 대한 구독을 취소할 때 사용
    • 더 이상 특정 queue나 topic에서 메세지를 수신하고 싶지 않은 경우에 사용
    • 주요 헤더
      • id: 구독 시 사용한 고유 ID. 이 ID를 통해 어떤 구독을 취소할 것인지 지정
  • DISCONNECT
    • 클라이언트가 서버와의 연결을 종료할 때 사용
    • 주요 헤더
      • receipt: 서버로부터 연결 종료 확인을 받기 위한 ID(선택적)

STOMP와 Spring WebSocket 통합

1. WebSocket 설정

Spring에서 WebSocket을 설정하고 엔드포인트를 통해 클라이언트가 서버에 연결

2. STOMP 메세지 처리

클라이언트는 특정 경로로 메세지를 보내고, 서버는 이를 처리하여 다른 클라이언트로 Broadcast

3. 메세지 브로커 사용

내부적으로 간단한 메세지 브로커(Simple Broker) 제공

외부 브로커(ActiveMQ, RabbitMQ 등)와 통합

4. SockJS 사용

WebSocket을 지원하지 않는 환경에서도 SockJS를 사용하여 WebSocket과 비슷한 경험 제공

웹 클라이언트

클라이언트는 브라우저에서 WebSocket 객체를 생성하고 서버에 연결 시도

연결 성공하면 클라이언트는 서버로 메세지를 보내거나 서버로부터 메세지 받을 수 있음

Spring WebSocket Server

스프링은 @EnableWebSocket 또는 @EnableWebSocketMessageBroker 어노테이션을 사용하여 WebSocket 활성화

WebSocketHandler: 실제로 메세지를 처리하는 역할, 연결의 수립 및 메세지 송수신 관리

STOMP 프로토콜(선택 사항)

STOMP 프로토콜을 사용하면 메세지 브로커를 통해 메세지를 관리

스프링에서는 기본적으로 SimpleBroker 사용하거나 외부 메세지 브로커 사용 가능

메세지 브로커

브로커는 클라이언트 간의 메세지 중계

이를 통해 복잡한 메세징 시나리오를 간편하게 구현 가능

클라이언트 측 메세지 처리

클라이언트는 서버로부터 수신한 메세지 처리

해당 데이터를 활용하여 필요한 작업 수행

이번 주 수업에 대해서
AOP라는 새로운 개념을 이해하는 데 많은 시간이 들었던 것 같다. 또한 Spring WebSocket의 경우, 네트워크 CS 지식이 필요한 부분이라 전공 수업의 기억을 되살려서 이해하느라 힘들었던 것 같다.

개인 회고
병원에 방문해서 추가로 검진 받느라 포스팅 업로드 날짜도 하루 늦춰지고, 정리도 마음에 들지않아 조금 아쉽다...
특히 HTTP - TCP - WebSocket 동작 과정 정리와 이해 도울 수 있는 이미지 추가로 더 넣고싶었는데 못 넣어서 아쉽다.. 나중에라도 추가하고싶다ㅠ

profile
256의 우연

0개의 댓글