✨KB IT's Your Life✨ 5기 TIL 기자단 활동
KB IT's Your Life 5기에서 학습한 내용을 복습하고자 정리한 글
기간: 8/18 ~ 8/25
학습 내용: Spring 활용 - REST, AOP, Spring WebSocket
Representational: 리소스의 표현을 전송한다는 의미(주소)
State: 리소스의 상태를 주고받는다는 의미
Transfer: 클라이언트와 서버 간 상태 정보를 주고받는다는 의미
웹 서비스 디자인 아키텍처 중 하나로 네트워크의 리소스를 정의하고, 이 리소스에 대한 주소(URL)를 지정하여 상태를 전송하는 방법을 제공한다는 개념
주소를 가지고 내가 원하는 자원을 명확하게 요청 가능!
모든 것이 자원(특정 데이터나 정보)으로 간주
URI(Uniform Resource Identifier)를 통해 식별
자원의 현재 상태는 XML, JSON, HTML 등 다양한 형식으로 표현
클라이언트와 서버 간 자원의 상태를 주고받으며, 클라이언트가 서버에 요청을 보내면 서버는 자원의 상태를 전달
REST는 주로 HTTP 프로토콜 사용
각 요청은 독립적
서버는 요청 간 상태 유지 X (쿠키, 세션 등으로 기억)
→ 각 요청에는 필요한 모든 정보가 포함되어야 함
여러 번 실행해도 결과가 동일한 연산의 특성
같은 표현과(=같은 주소로) 같은 상태 요청했을 때 내부적으로 항상 동일하게 처리되어야 함
클라이언트가 동적으로 서버에서 제공하는 링크 따라서 자원에 접근하거나 상태 변경할수 있게 함
클라이언트와 서버가 서로 독립적으로 개발되고 배포될 수 있는 구조
단순성
확장성
유연성
표준화
REST 원칙을 따르는 애플리케이션 프로그래밍 인터페이스를 의미
RESTful API 보다 추상적이고 일반적인 개념
REST 원칙을 따르는 애플리케이션을 구현하는 방식에 대한 구체적인 지침
REST API의 구현을 통해 일관된 인터페이스 제공 목표로 함
⇒ REST API의 구현 세부 사항을 명확하게 따르는 것을 의미하는게 RESTful API
프로그램에서 핵심 기능과 공통 기능을 분리하여 관리할 수 있게 하는 프로그래밍
페이지의 구성을 핵심 기능과 공통 기능 두 가지 관점(Aspect)으로 나눠서 구현
Aspect(관점)
부가적 기능 가진 클래스 = 관점 클래스(예: 로그인/로그아웃)
실행 시 핵심 관점 사이에 공통 관점을 끼워넣음
OOP와 AOP 비교
OOP - 클래스(객체) 기반으로 프로그램 구성
AOP - 클래스(객체) 내의 특정 메서드 기반으로 프로그램 구성
→ 핵심 관점과 부가 관점으로 구분하여 프로그래밍
Spring에서는 AOP를 보다 쉽게하기 위한 기능들을 제공하고 있다!
AOP → 설정만 해두면 개발자 대신해서 설정해둔 시점에 호출
Spring AOP는 대표적인 Proxy 패턴 적용 예제!
@Aspect로 정의된 클래스 바탕으로 프록시 객체 생성
해당 프록시 객체는 타겟 객체의 메서드 호출 전에 advice 적용
클라이언트가 타겟 객체의 메서드 호출 = 프록시 객체의 메서드가 호출
→ 프록시 객체는 요청을 가로채고 정의된 Advice(@Before, @After, @Around)를 실행한 뒤 실제 타겟 객체의 메서드 호출
클라이언트는 타겟 객체 메서드만 호출하는 점 유의!
프록시는 메서드 호출 전/후에 advice를 적용하거나 메서드 실행을 제어
애플리케이션의 핵심 로직에 영향을 주지 않고 횡단 관심사를 쉽게 추가 가능
→ 유지보수 측면에서 편리
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의 대상이 되는 클래스 = 타겟 객체

@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
금융 서비스의 특정한 요청하기 전에 AOP를 통해 사용자의 인증 정보를 검증, 권한이 없는 사용자의 접근을 막는 로직을 자동으로 처리
트랜잭션 단위로 커밋, 롤백 처리
특정 처리와 관련해서 로깅/감사 로그 기록
→ 특히 고객의 모든 중요한 행동을 추적하는 감사로그가 금융 기관에서는 굉장히 중요한 작업
시스템의 성능 측정 및 특정 메서드의 실행시간 자동 기록에도 AOP를 활용한다!
스프링 프레임워크에서 웹 소켓 프로토콜을 지원하는 모듈
STOMP와 SockJS 통해서 무리없이 양방향 통신 가능
💡 웹 소켓이란?
TCP 기반의 프로토콜
클라이언트와 서버 간 양방향 통신 지원
브라우저와 브라우저 간 채팅 → 브라우저가 직접 통신하는 건 X
중간에 사이트 서버가 존재하고, 브라우저 ↔ 서버 ↔ 브라우저 형태로 통신
서버가 일종의 브로커 역할
⇒ 구현 쉽지 않다
단체 채팅방
특정 브라우저에서 작성한 채팅 해당 채팅방에 들어와있는 모든 브라우저에게 전송되어야 함
마찬가지로 서버 통해서 통신하는 것
어떤 채팅방에 누가 멤버로 있는지 기록 가지고 있어야 함
서버에서는 해당 채팅방에 누가 메세지 보냈는지 정보 받아서 해당 채팅방 멤버에게 전달해줘야 함 = BroadCasting
→ 데이터 보낼 때 작성한 메세지만 보내는 게 아닌 누가 언제 작성한 메세지인지 같이 전달
묶어서 전달 필요 = 자바 구현시에는 key-value형태로 만들어서 VO, DTO에 넣어서 전달
클라이언트 환경에 맞게 출력되도록 서버에서는 데이터만 전송
→ 일반적으로 많이 사용되는 key-value 형태의 데이터가 json
모든 브라우저가 웹소켓 통신 지원 X
웹소켓 지원하는 라이브러리 브라우저에서 필요
→ 웹소켓 = 동적 기능 = JS 라이브러리 이용해서 적용(SockJS)
STOMP 라이브러리 통해서 채팅방에 들어와있는 브라우저 생존 여부 확인, 각 웹소켓별 필요한 기능 메서드로 제공
텍스트 기반 메세징 프로토콜
웹 소켓 프로토콜 위에서 사용
클라이언트와 메세지 브로커 간 통신을 위한 규약 정의
메세징에 특화된 프로토콜
Spring에서 WebSocket을 설정하고 엔드포인트를 통해 클라이언트가 서버에 연결
클라이언트는 특정 경로로 메세지를 보내고, 서버는 이를 처리하여 다른 클라이언트로 Broadcast
내부적으로 간단한 메세지 브로커(Simple Broker) 제공
외부 브로커(ActiveMQ, RabbitMQ 등)와 통합
WebSocket을 지원하지 않는 환경에서도 SockJS를 사용하여 WebSocket과 비슷한 경험 제공

클라이언트는 브라우저에서 WebSocket 객체를 생성하고 서버에 연결 시도
연결 성공하면 클라이언트는 서버로 메세지를 보내거나 서버로부터 메세지 받을 수 있음
스프링은 @EnableWebSocket 또는 @EnableWebSocketMessageBroker 어노테이션을 사용하여 WebSocket 활성화
WebSocketHandler: 실제로 메세지를 처리하는 역할, 연결의 수립 및 메세지 송수신 관리
STOMP 프로토콜을 사용하면 메세지 브로커를 통해 메세지를 관리
스프링에서는 기본적으로 SimpleBroker 사용하거나 외부 메세지 브로커 사용 가능
브로커는 클라이언트 간의 메세지 중계
이를 통해 복잡한 메세징 시나리오를 간편하게 구현 가능
클라이언트는 서버로부터 수신한 메세지 처리
해당 데이터를 활용하여 필요한 작업 수행
이번 주 수업에 대해서
AOP라는 새로운 개념을 이해하는 데 많은 시간이 들었던 것 같다. 또한 Spring WebSocket의 경우, 네트워크 CS 지식이 필요한 부분이라 전공 수업의 기억을 되살려서 이해하느라 힘들었던 것 같다.
개인 회고
병원에 방문해서 추가로 검진 받느라 포스팅 업로드 날짜도 하루 늦춰지고, 정리도 마음에 들지않아 조금 아쉽다...
특히 HTTP - TCP - WebSocket 동작 과정 정리와 이해 도울 수 있는 이미지 추가로 더 넣고싶었는데 못 넣어서 아쉽다.. 나중에라도 추가하고싶다ㅠ
