Spring
스프링 프레임워크와 관련된 내용입니다.

-
헥사고날 아키텍쳐위의 그림은 헥사고날 아키텍쳐를 검색하면 가장 많이 나오는 그림이다. 해당 그림만 볼 때는 어떤 걸 말하려는 거지? Port-Adapter 패턴을 활용해? 개발 주니어인 나에게 해당 그림은 어렵게만 다가왔었다. 사실 해당 내용은 그렇게 어렵지 않은 개념일 수도 있다. 결론만 말하면 기존 레이어 아키텍처에서 도메인 엔티티가 의존 해야 했던 객체들을 의존성 역전을 통해 가장 중요한 도메인을 메인으로 하여 개발이 이루어질 수 있도록 한 디자인 패턴이다. 위의 그림이 Port-Adapter 패턴을 잘 표현한 그림이라 할 수 있다. 하지만 특정 포트는 특정 업무를 담당해야 한다.(인터페이스를 통한 의존성 역전) 전자 기기들은 어떤 전자기기의 형태이든 상관없이 USB형태를 가지고 있으면 된다. 레..
헥사고날 아키텍처 with SpringBoot헥사고날 아키텍쳐위의 그림은 헥사고날 아키텍쳐를 검색하면 가장 많이 나오는 그림이다. 해당 그림만 볼 때는 어떤 걸 말하려는 거지? Port-Adapter 패턴을 활용해? 개발 주니어인 나에게 해당 그림은 어렵게만 다가왔었다. 사실 해당 내용은 그렇게 어렵지 않은 개념일 수도 있다. 결론만 말하면 기존 레이어 아키텍처에서 도메인 엔티티가 의존 해야 했던 객체들을 의존성 역전을 통해 가장 중요한 도메인을 메인으로 하여 개발이 이루어질 수 있도록 한 디자인 패턴이다. 위의 그림이 Port-Adapter 패턴을 잘 표현한 그림이라 할 수 있다. 하지만 특정 포트는 특정 업무를 담당해야 한다.(인터페이스를 통한 의존성 역전) 전자 기기들은 어떤 전자기기의 형태이든 상관없이 USB형태를 가지고 있으면 된다. 레..
2024.09.23 -
스프링 시큐리티 인증 및 권한처리 개요스프링에서 시큐리티를 활용한 인증 권한을 거치면 해당 사용자는 위 사진과 같은 과정을 통해 권한을 얻게 된다. 인증 / 인가 과정 중에 SecurityContextHolder 내부에 인증 객체를 저장하는데 이 인증 객체 내부에서 일반적으로 사용되는 UserDetails 내 getAuthorities()를 통해 해당 유저의 권한을 확인 할 수 있다. 코드를 통해서도 아래와 같은 방식으로 권한을 확인할 수 있다.if (authentication.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_ADMIN"))) { redirectStrategy.sendRedirect(request, response, "/adm..
[Spring Security] 스프링 시큐리티 권한처리 하기스프링 시큐리티 인증 및 권한처리 개요스프링에서 시큐리티를 활용한 인증 권한을 거치면 해당 사용자는 위 사진과 같은 과정을 통해 권한을 얻게 된다. 인증 / 인가 과정 중에 SecurityContextHolder 내부에 인증 객체를 저장하는데 이 인증 객체 내부에서 일반적으로 사용되는 UserDetails 내 getAuthorities()를 통해 해당 유저의 권한을 확인 할 수 있다. 코드를 통해서도 아래와 같은 방식으로 권한을 확인할 수 있다.if (authentication.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_ADMIN"))) { redirectStrategy.sendRedirect(request, response, "/adm..
2024.06.04 -
개요스프링 부트를 활용하여 채팅 기능이 포함된 프로젝트를 구현 하였다. STOMP를 활용했고, 스프링 시큐티리와 JWT를 통해 채팅 구현 내용과 사용자 인증 과정 및 코드를 공유한다. STOMP란?웹 소켓, TCP와 같이 양방향 네트워크 프로토콜 위에서 사용되는 서브 프로토콜이다. websocket을 통해 직접 구현하기 보다 메시지를 편리하게 사용하도록 구현되어 있는 STOMP를 활용하였다. 주요 특징 및 개념텍스트 기반 프로토콜:STOMP는 텍스트 기반 프로토콜로, 프레임(frame)이라고 불리는 명령어를 텍스트 형식으로 전달한다. 각 프레임은 명령어, 헤더, 본문으로 구성된다.프레임 구조:명령어(Command): CONNECT, SEND, SUBSCRIBE, UNSUBSCRIBE, BEGIN, CO..
[스프링 부트 + 시큐리티 + REST] STOMP를 통한 채팅 구현(JWT를 통한 사용자 인증)개요스프링 부트를 활용하여 채팅 기능이 포함된 프로젝트를 구현 하였다. STOMP를 활용했고, 스프링 시큐티리와 JWT를 통해 채팅 구현 내용과 사용자 인증 과정 및 코드를 공유한다. STOMP란?웹 소켓, TCP와 같이 양방향 네트워크 프로토콜 위에서 사용되는 서브 프로토콜이다. websocket을 통해 직접 구현하기 보다 메시지를 편리하게 사용하도록 구현되어 있는 STOMP를 활용하였다. 주요 특징 및 개념텍스트 기반 프로토콜:STOMP는 텍스트 기반 프로토콜로, 프레임(frame)이라고 불리는 명령어를 텍스트 형식으로 전달한다. 각 프레임은 명령어, 헤더, 본문으로 구성된다.프레임 구조:명령어(Command): CONNECT, SEND, SUBSCRIBE, UNSUBSCRIBE, BEGIN, CO..
2024.05.29 -
개요 이전에 개발 동아리 홈페이지 제작 프로젝트 중에 깃허브를 활용하여 동아리 회원 인증을 하자는 의견으로 Github Oauth + RestAPI + JWT 구현 했던 내용을 정리한다. 굳이 Github OAuth를 사용해야 했던 이유 동아리의 모든 인원이 github가입이 필수 홈페이지에 github api와 연동해야 했음(깃허브 커밋시 활동 포인트 증가 기능) 소개 JWT의 동작의 장점은 따로 세션 서버를 구성하지 않고도 확장성이 뛰어나다는 점이다. 또한 토큰을 서버에서 관리하지 않고 클라이언트 쪽에서 관리하기 때문에 서버 쪽 부담이 적다. 기본적으로 스프링 시큐리티는 세션 기반으로 동작한다. 이를 JWT 기반 동작으로 변경해야 하는데, 시큐리티는 변화에 유연하기 때문에 기존 동작들을 사용자가 원하..
스프링 시큐리티 + Github Oauth + RESTAPI + JWT 활용(With Gradle)개요 이전에 개발 동아리 홈페이지 제작 프로젝트 중에 깃허브를 활용하여 동아리 회원 인증을 하자는 의견으로 Github Oauth + RestAPI + JWT 구현 했던 내용을 정리한다. 굳이 Github OAuth를 사용해야 했던 이유 동아리의 모든 인원이 github가입이 필수 홈페이지에 github api와 연동해야 했음(깃허브 커밋시 활동 포인트 증가 기능) 소개 JWT의 동작의 장점은 따로 세션 서버를 구성하지 않고도 확장성이 뛰어나다는 점이다. 또한 토큰을 서버에서 관리하지 않고 클라이언트 쪽에서 관리하기 때문에 서버 쪽 부담이 적다. 기본적으로 스프링 시큐리티는 세션 기반으로 동작한다. 이를 JWT 기반 동작으로 변경해야 하는데, 시큐리티는 변화에 유연하기 때문에 기존 동작들을 사용자가 원하..
2024.01.29 -
😒개요 기존 코드가 롬복의 @Builder를 사용하여 빌더 패턴을 구현했는데, 사용하다 보니 필드 값이 많아 질 때, 대충 맞겠지 하면서 값을 입력했더니, 개발하다 보니 Builder를 통해 인스턴스 생성시, 나중에 null이 들어가는 부분이 계속 생겨났다. 그냥 내 실수려니 하고 넘어가다가 반복되니, 이건 코드의 문제다 싶어서, 객체 초기화 할 때, 간단하게 필수 값을 검증해야겠다! 라는 생각부터 시작되게 되었다. 이런 식의 코드처럼.. title을 빼먹는다거나… 👍해결방법 1. 직접 Null 체크 가장 직접적인 방법은 Null체크 하는 메서드를 실제로 만들어서 체크하는 방법이다. class Post { private final String title; private final String conten..
[Spring] 롬복을 사용한 Builder 패턴 Null체크 하며 사용하기😒개요 기존 코드가 롬복의 @Builder를 사용하여 빌더 패턴을 구현했는데, 사용하다 보니 필드 값이 많아 질 때, 대충 맞겠지 하면서 값을 입력했더니, 개발하다 보니 Builder를 통해 인스턴스 생성시, 나중에 null이 들어가는 부분이 계속 생겨났다. 그냥 내 실수려니 하고 넘어가다가 반복되니, 이건 코드의 문제다 싶어서, 객체 초기화 할 때, 간단하게 필수 값을 검증해야겠다! 라는 생각부터 시작되게 되었다. 이런 식의 코드처럼.. title을 빼먹는다거나… 👍해결방법 1. 직접 Null 체크 가장 직접적인 방법은 Null체크 하는 메서드를 실제로 만들어서 체크하는 방법이다. class Post { private final String title; private final String conten..
2023.11.10 -
😊개요 한창 프로젝트를 하며 스프링과 객체지향을 접하고 활용 했을 때, 의존성에 관한 고민을 매우 많이 했었다. 그러던 도중 유튜브에서 우아한 객체지향 by 조영호님의 세미나를 듣고, 그동안 프로젝트를 진행하면서 이게맞나? 라고 생각했던 실타래들이 하나하나 풀리게 되면서 입을 벌린 상태로 보며 정리했었던 적이 있다. 그때의 내용을 곱씹으면서 다시 정리 해보자고 생각했다. 다음과 같이 변경하게되면 기존에 적었던 메서드들이 모두 컴파일에러를 띄울것이다. 연관관계로 참조했던 것들이 객체를 끊어버리게 되니깐 Entity내부에서 구현했던 연관관계 객체들에서 error를 반환한다. Id로 참조하는 공통 로직을 객체를 새로 생성해 하나에 몰아 넣는다. 🎈과연 이렇게 하는 것이 좋은 변경일까? 객체 지향은 여러객체를 ..
우아한 객체지향 [우아한테크세미나] 정리 5😊개요 한창 프로젝트를 하며 스프링과 객체지향을 접하고 활용 했을 때, 의존성에 관한 고민을 매우 많이 했었다. 그러던 도중 유튜브에서 우아한 객체지향 by 조영호님의 세미나를 듣고, 그동안 프로젝트를 진행하면서 이게맞나? 라고 생각했던 실타래들이 하나하나 풀리게 되면서 입을 벌린 상태로 보며 정리했었던 적이 있다. 그때의 내용을 곱씹으면서 다시 정리 해보자고 생각했다. 다음과 같이 변경하게되면 기존에 적었던 메서드들이 모두 컴파일에러를 띄울것이다. 연관관계로 참조했던 것들이 객체를 끊어버리게 되니깐 Entity내부에서 구현했던 연관관계 객체들에서 error를 반환한다. Id로 참조하는 공통 로직을 객체를 새로 생성해 하나에 몰아 넣는다. 🎈과연 이렇게 하는 것이 좋은 변경일까? 객체 지향은 여러객체를 ..
2023.11.08 -
😊개요 한창 프로젝트를 하며 스프링과 객체지향을 접하고 활용 했을 때, 의존성에 관한 고민을 매우 많이 했었다. 그러던 도중 유튜브에서 우아한 객체지향 by 조영호님의 세미나를 듣고, 그동안 프로젝트를 진행하면서 이게맞나? 라고 생각했던 실타래들이 하나하나 풀리게 되면서 입을 벌린 상태로 보며 정리했었던 적이 있다. 그때의 내용을 곱씹으면서 다시 정리 해보자고 생각했다. 🎈설계 개선하기 설계를 진화시키기 위한 출발점 코드 작성 후 의존성 관점에서 설계 검토 → shop과 order에서 사이클이 발생한다. 🎈해결 1. 중간 객체를 이용한 의존성 사이클 끊기 어떻게 보면 DIP의 변형이라 볼 수 있다. 의존성을 끊고 장바구니에서도 OptionGroup과 Option을 활용할 수 있으므로 재사용성이 증가한다...
우아한 객체지향 [우아한테크세미나] 정리 4😊개요 한창 프로젝트를 하며 스프링과 객체지향을 접하고 활용 했을 때, 의존성에 관한 고민을 매우 많이 했었다. 그러던 도중 유튜브에서 우아한 객체지향 by 조영호님의 세미나를 듣고, 그동안 프로젝트를 진행하면서 이게맞나? 라고 생각했던 실타래들이 하나하나 풀리게 되면서 입을 벌린 상태로 보며 정리했었던 적이 있다. 그때의 내용을 곱씹으면서 다시 정리 해보자고 생각했다. 🎈설계 개선하기 설계를 진화시키기 위한 출발점 코드 작성 후 의존성 관점에서 설계 검토 → shop과 order에서 사이클이 발생한다. 🎈해결 1. 중간 객체를 이용한 의존성 사이클 끊기 어떻게 보면 DIP의 변형이라 볼 수 있다. 의존성을 끊고 장바구니에서도 OptionGroup과 Option을 활용할 수 있으므로 재사용성이 증가한다...
2023.11.08 -
😊개요 한창 프로젝트를 하며 스프링과 객체지향을 접하고 활용 했을 때, 의존성에 관한 고민을 매우 많이 했었다. 그러던 도중 유튜브에서 우아한 객체지향 by 조영호님의 세미나를 듣고, 그동안 프로젝트를 진행하면서 이게맞나? 라고 생각했던 실타래들이 하나하나 풀리게 되면서 입을 벌린 상태로 보며 정리했었던 적이 있다. 그때의 내용을 곱씹으면서 다시 정리 해보자고 생각했다. 🎈관계의 종류 결정하기 연관관계 → 영구적인 탐색구조가 필요하다면 연관관계로 잡는다. 위와 같은관계에서 만약 Order랑 Shop이랑 굉장히 빈번하게 호출이 발생한다면 연관관계로 잡는것이 좋다. 의존관계 → 협력을 위해 일시적으로 필요한 의존성(파라미터, 리턴타입, 지역변수) → 연관관계는 탐색 가능성을 말하며 두 객체사이에 협력이 필요..
우아한 객체지향 [우아한테크세미나] 정리 3😊개요 한창 프로젝트를 하며 스프링과 객체지향을 접하고 활용 했을 때, 의존성에 관한 고민을 매우 많이 했었다. 그러던 도중 유튜브에서 우아한 객체지향 by 조영호님의 세미나를 듣고, 그동안 프로젝트를 진행하면서 이게맞나? 라고 생각했던 실타래들이 하나하나 풀리게 되면서 입을 벌린 상태로 보며 정리했었던 적이 있다. 그때의 내용을 곱씹으면서 다시 정리 해보자고 생각했다. 🎈관계의 종류 결정하기 연관관계 → 영구적인 탐색구조가 필요하다면 연관관계로 잡는다. 위와 같은관계에서 만약 Order랑 Shop이랑 굉장히 빈번하게 호출이 발생한다면 연관관계로 잡는것이 좋다. 의존관계 → 협력을 위해 일시적으로 필요한 의존성(파라미터, 리턴타입, 지역변수) → 연관관계는 탐색 가능성을 말하며 두 객체사이에 협력이 필요..
2023.11.07 -
😊개요 한창 프로젝트를 하며 스프링과 객체지향을 접하고 활용 했을 때, 의존성에 관한 고민을 매우 많이 했었다. 그러던 도중 유튜브에서 우아한 객체지향 by 조영호님의 세미나를 듣고, 그동안 프로젝트를 진행하면서 이게맞나? 라고 생각했던 실타래들이 하나하나 풀리게 되면서 입을 벌린 상태로 보며 정리했었던 적이 있다. 그때의 내용을 곱씹으면서 다시 정리 해보자고 생각했다. 🎈예제(배달 앱) 🎈문제점 사용자가 메뉴를 고름 → 장바구니에 담음 → 이 때 업소에서 해당 메뉴를 변경시킨다. 이 때,가게의 메뉴와 장바구니에 담긴 내용이 다르므로 Validation Check가 필요하다. 🎈Valication 체크 위와 같은 관계에는 방향성이 필요하다. 방향이 잡히면 이는 곧 의존성의 방향이된다. 참고영상
우아한 객체지향 [우아한테크세미나] 정리 2😊개요 한창 프로젝트를 하며 스프링과 객체지향을 접하고 활용 했을 때, 의존성에 관한 고민을 매우 많이 했었다. 그러던 도중 유튜브에서 우아한 객체지향 by 조영호님의 세미나를 듣고, 그동안 프로젝트를 진행하면서 이게맞나? 라고 생각했던 실타래들이 하나하나 풀리게 되면서 입을 벌린 상태로 보며 정리했었던 적이 있다. 그때의 내용을 곱씹으면서 다시 정리 해보자고 생각했다. 🎈예제(배달 앱) 🎈문제점 사용자가 메뉴를 고름 → 장바구니에 담음 → 이 때 업소에서 해당 메뉴를 변경시킨다. 이 때,가게의 메뉴와 장바구니에 담긴 내용이 다르므로 Validation Check가 필요하다. 🎈Valication 체크 위와 같은 관계에는 방향성이 필요하다. 방향이 잡히면 이는 곧 의존성의 방향이된다. 참고영상
2023.11.07 -
😊개요 한창 프로젝트를 하며 스프링과 객체지향을 접하고 활용 했을 때, 의존성에 관한 고민을 매우 많이 했었다. 그러던 도중 유튜브에서 우아한 객체지향 by 조영호님의 세미나를 듣고, 그동안 프로젝트를 진행하면서 이게맞나? 라고 생각했던 실타래들이 하나하나 풀리게 되면서 입을 벌린 상태로 보며 정리했었던 적이 있다. 그때의 내용을 곱씹으면서 다시 정리 해보자고 생각했다. 🎈의존성을 이용해 설계 진화시키기 설계 → 코드를 어떻게 배치할 것인가? → 핵심은 변경에 초점을 맞춘다. 같이변경되는 코드를 같이 넣고 변경되지 않는코드를 따로 넣어야 한다. 의존성 의존성이 있다라는 것은 위의 그림에서 B가 변경될 때 A도 함께 변경될 가능성이 있는 것을 말한다. 하지만 꼭 영향을 주는 것이 아니라 가능성이 있는 것을..
우아한 객체지향 [우아한테크세미나] 정리 1😊개요 한창 프로젝트를 하며 스프링과 객체지향을 접하고 활용 했을 때, 의존성에 관한 고민을 매우 많이 했었다. 그러던 도중 유튜브에서 우아한 객체지향 by 조영호님의 세미나를 듣고, 그동안 프로젝트를 진행하면서 이게맞나? 라고 생각했던 실타래들이 하나하나 풀리게 되면서 입을 벌린 상태로 보며 정리했었던 적이 있다. 그때의 내용을 곱씹으면서 다시 정리 해보자고 생각했다. 🎈의존성을 이용해 설계 진화시키기 설계 → 코드를 어떻게 배치할 것인가? → 핵심은 변경에 초점을 맞춘다. 같이변경되는 코드를 같이 넣고 변경되지 않는코드를 따로 넣어야 한다. 의존성 의존성이 있다라는 것은 위의 그림에서 B가 변경될 때 A도 함께 변경될 가능성이 있는 것을 말한다. 하지만 꼭 영향을 주는 것이 아니라 가능성이 있는 것을..
2023.11.07 -
🥴Paging? 글 목록이나 유저 목록 등을 구현하다 보면 페이징이 필요한 경우가 있다. 페이지를 나눠 해당 페이지에 필요한 정보만 보내기도 하고, 정렬 기준이 필요한 경우도 있을 것이다. 스프링에서는 간편하게도 해당 기능을 구현한 Page, Pageable이 존재한다. 현재 프로젝트 구현 중에 페이지 처리를 해야 하는 부분이 생겨서 해당 기능을 간략하게 정리해 보려고 한다. 🛰️Controller 먼저 컨트롤러에서의 Paging처리이다. 보통 요청은 다음과 같이 Pageable의 page, size, sort 3가지의 파라미터로 요청받는다. /api/admin/users?page=3&size=1&sort=id,DESC → 3번째 페이지 / 페이지당 사이즈 1 / id기준 내림차순 정렬 @GetMappi..
스프링부트 페이징처리하기(JPA + RESTAPI)🥴Paging? 글 목록이나 유저 목록 등을 구현하다 보면 페이징이 필요한 경우가 있다. 페이지를 나눠 해당 페이지에 필요한 정보만 보내기도 하고, 정렬 기준이 필요한 경우도 있을 것이다. 스프링에서는 간편하게도 해당 기능을 구현한 Page, Pageable이 존재한다. 현재 프로젝트 구현 중에 페이지 처리를 해야 하는 부분이 생겨서 해당 기능을 간략하게 정리해 보려고 한다. 🛰️Controller 먼저 컨트롤러에서의 Paging처리이다. 보통 요청은 다음과 같이 Pageable의 page, size, sort 3가지의 파라미터로 요청받는다. /api/admin/users?page=3&size=1&sort=id,DESC → 3번째 페이지 / 페이지당 사이즈 1 / id기준 내림차순 정렬 @GetMappi..
2023.08.04 -
✅SLF4J Simple Logging Facade for Java 💡다양한 로깅 프레임워크에 대한 추상화(인터페이스) 역할 💡단독으로 사용 불가능 💡최종 사용자가 배포시 원하는 구현체를 선택 Bridge 다른 로깅 API로의 Logger 호출을 SF4J 인터페이스로 연결하여 SLF4J API가 대신 처리할 수 있도록 하는 일종의 어댑터 역할을 하는 라이브러리 SLF4J API(인터페이스) 로깅에 대한 추상 레이어(인터페이스)를 제공한다. 로깅 동작에 대한 역할을 수행할 추상 메서드를 제공한다. 추상클래스이기 때문에 이 라이브러리만 단독적으로 쓰일 수 없다. Binding SLF4J 인터페이스를 로깅 구현체와 연결하는 어탭터 역할을 하는 라이브러리. SJF4J API를 구현한 클래스에서 Binding으로..
SLF4J + Log4j2 설정해보기✅SLF4J Simple Logging Facade for Java 💡다양한 로깅 프레임워크에 대한 추상화(인터페이스) 역할 💡단독으로 사용 불가능 💡최종 사용자가 배포시 원하는 구현체를 선택 Bridge 다른 로깅 API로의 Logger 호출을 SF4J 인터페이스로 연결하여 SLF4J API가 대신 처리할 수 있도록 하는 일종의 어댑터 역할을 하는 라이브러리 SLF4J API(인터페이스) 로깅에 대한 추상 레이어(인터페이스)를 제공한다. 로깅 동작에 대한 역할을 수행할 추상 메서드를 제공한다. 추상클래스이기 때문에 이 라이브러리만 단독적으로 쓰일 수 없다. Binding SLF4J 인터페이스를 로깅 구현체와 연결하는 어탭터 역할을 하는 라이브러리. SJF4J API를 구현한 클래스에서 Binding으로..
2023.07.05