- 방문자수
- 베스트 게시글
전체 방문자
오늘 방문자
어제 방문자
스프링
-
헥사고날 아키텍처 with SpringBoot
헥사고날 아키텍쳐위의 그림은 헥사고날 아키텍쳐를 검색하면 가장 많이 나오는 그림이다. 해당 그림만 볼 때는 어떤 걸 말하려는 거지? Port-Adapter 패턴을 활용해? 개발 주니어인 나에게 해당 그림은 어렵게만 다가왔었다. 사실 해당 내용은 그렇게 어렵지 않은 개념일 수도 있다. 결론만 말하면 기존 레이어 아키텍처에서 도메인 엔티티가 의존 해야 했던 객체들을 의존성 역전을 통해 가장 중요한 도메인을 메인으로 하여 개발이 이루어질 수 있도록 한 디자인 패턴이다. 위의 그림이 Port-Adapter 패턴을 잘 표현한 그림이라 할 수 있다. 하지만 특정 포트는 특정 업무를 담당해야 한다.(인터페이스를 통한 의존성 역전) 전자 기기들은 어떤 전자기기의 형태이든 상관없이 USB형태를 가지고 있으면 된다. 레..
-
[Spring Security] 스프링 시큐리티 권한처리 하기
스프링 시큐리티 인증 및 권한처리 개요스프링에서 시큐리티를 활용한 인증 권한을 거치면 해당 사용자는 위 사진과 같은 과정을 통해 권한을 얻게 된다. 인증 / 인가 과정 중에 SecurityContextHolder 내부에 인증 객체를 저장하는데 이 인증 객체 내부에서 일반적으로 사용되는 UserDetails 내 getAuthorities()를 통해 해당 유저의 권한을 확인 할 수 있다. 코드를 통해서도 아래와 같은 방식으로 권한을 확인할 수 있다.if (authentication.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_ADMIN"))) { redirectStrategy.sendRedirect(request, response, "/adm..
-
[스프링 부트 + 시큐리티 + REST] STOMP를 통한 채팅 구현(JWT를 통한 사용자 인증)
개요스프링 부트를 활용하여 채팅 기능이 포함된 프로젝트를 구현 하였다. STOMP를 활용했고, 스프링 시큐티리와 JWT를 통해 채팅 구현 내용과 사용자 인증 과정 및 코드를 공유한다. STOMP란?웹 소켓, TCP와 같이 양방향 네트워크 프로토콜 위에서 사용되는 서브 프로토콜이다. websocket을 통해 직접 구현하기 보다 메시지를 편리하게 사용하도록 구현되어 있는 STOMP를 활용하였다. 주요 특징 및 개념텍스트 기반 프로토콜:STOMP는 텍스트 기반 프로토콜로, 프레임(frame)이라고 불리는 명령어를 텍스트 형식으로 전달한다. 각 프레임은 명령어, 헤더, 본문으로 구성된다.프레임 구조:명령어(Command): CONNECT, SEND, SUBSCRIBE, UNSUBSCRIBE, BEGIN, CO..
-
스프링 시큐리티 + Github Oauth + RESTAPI + JWT 활용(With Gradle)
개요 이전에 개발 동아리 홈페이지 제작 프로젝트 중에 깃허브를 활용하여 동아리 회원 인증을 하자는 의견으로 Github Oauth + RestAPI + JWT 구현 했던 내용을 정리한다. 굳이 Github OAuth를 사용해야 했던 이유 동아리의 모든 인원이 github가입이 필수 홈페이지에 github api와 연동해야 했음(깃허브 커밋시 활동 포인트 증가 기능) 소개 JWT의 동작의 장점은 따로 세션 서버를 구성하지 않고도 확장성이 뛰어나다는 점이다. 또한 토큰을 서버에서 관리하지 않고 클라이언트 쪽에서 관리하기 때문에 서버 쪽 부담이 적다. 기본적으로 스프링 시큐리티는 세션 기반으로 동작한다. 이를 JWT 기반 동작으로 변경해야 하는데, 시큐리티는 변화에 유연하기 때문에 기존 동작들을 사용자가 원하..
-
[Spring] 롬복을 사용한 Builder 패턴 Null체크 하며 사용하기
😒개요 기존 코드가 롬복의 @Builder를 사용하여 빌더 패턴을 구현했는데, 사용하다 보니 필드 값이 많아 질 때, 대충 맞겠지 하면서 값을 입력했더니, 개발하다 보니 Builder를 통해 인스턴스 생성시, 나중에 null이 들어가는 부분이 계속 생겨났다. 그냥 내 실수려니 하고 넘어가다가 반복되니, 이건 코드의 문제다 싶어서, 객체 초기화 할 때, 간단하게 필수 값을 검증해야겠다! 라는 생각부터 시작되게 되었다. 이런 식의 코드처럼.. title을 빼먹는다거나… 👍해결방법 1. 직접 Null 체크 가장 직접적인 방법은 Null체크 하는 메서드를 실제로 만들어서 체크하는 방법이다. class Post { private final String title; private final String conten..
-
우아한 객체지향 [우아한테크세미나] 정리 5
😊개요 한창 프로젝트를 하며 스프링과 객체지향을 접하고 활용 했을 때, 의존성에 관한 고민을 매우 많이 했었다. 그러던 도중 유튜브에서 우아한 객체지향 by 조영호님의 세미나를 듣고, 그동안 프로젝트를 진행하면서 이게맞나? 라고 생각했던 실타래들이 하나하나 풀리게 되면서 입을 벌린 상태로 보며 정리했었던 적이 있다. 그때의 내용을 곱씹으면서 다시 정리 해보자고 생각했다. 다음과 같이 변경하게되면 기존에 적었던 메서드들이 모두 컴파일에러를 띄울것이다. 연관관계로 참조했던 것들이 객체를 끊어버리게 되니깐 Entity내부에서 구현했던 연관관계 객체들에서 error를 반환한다. Id로 참조하는 공통 로직을 객체를 새로 생성해 하나에 몰아 넣는다. 🎈과연 이렇게 하는 것이 좋은 변경일까? 객체 지향은 여러객체를 ..
-
우아한 객체지향 [우아한테크세미나] 정리 4
😊개요 한창 프로젝트를 하며 스프링과 객체지향을 접하고 활용 했을 때, 의존성에 관한 고민을 매우 많이 했었다. 그러던 도중 유튜브에서 우아한 객체지향 by 조영호님의 세미나를 듣고, 그동안 프로젝트를 진행하면서 이게맞나? 라고 생각했던 실타래들이 하나하나 풀리게 되면서 입을 벌린 상태로 보며 정리했었던 적이 있다. 그때의 내용을 곱씹으면서 다시 정리 해보자고 생각했다. 🎈설계 개선하기 설계를 진화시키기 위한 출발점 코드 작성 후 의존성 관점에서 설계 검토 → shop과 order에서 사이클이 발생한다. 🎈해결 1. 중간 객체를 이용한 의존성 사이클 끊기 어떻게 보면 DIP의 변형이라 볼 수 있다. 의존성을 끊고 장바구니에서도 OptionGroup과 Option을 활용할 수 있으므로 재사용성이 증가한다...
-
우아한 객체지향 [우아한테크세미나] 정리 3
😊개요 한창 프로젝트를 하며 스프링과 객체지향을 접하고 활용 했을 때, 의존성에 관한 고민을 매우 많이 했었다. 그러던 도중 유튜브에서 우아한 객체지향 by 조영호님의 세미나를 듣고, 그동안 프로젝트를 진행하면서 이게맞나? 라고 생각했던 실타래들이 하나하나 풀리게 되면서 입을 벌린 상태로 보며 정리했었던 적이 있다. 그때의 내용을 곱씹으면서 다시 정리 해보자고 생각했다. 🎈관계의 종류 결정하기 연관관계 → 영구적인 탐색구조가 필요하다면 연관관계로 잡는다. 위와 같은관계에서 만약 Order랑 Shop이랑 굉장히 빈번하게 호출이 발생한다면 연관관계로 잡는것이 좋다. 의존관계 → 협력을 위해 일시적으로 필요한 의존성(파라미터, 리턴타입, 지역변수) → 연관관계는 탐색 가능성을 말하며 두 객체사이에 협력이 필요..
-
우아한 객체지향 [우아한테크세미나] 정리 2
😊개요 한창 프로젝트를 하며 스프링과 객체지향을 접하고 활용 했을 때, 의존성에 관한 고민을 매우 많이 했었다. 그러던 도중 유튜브에서 우아한 객체지향 by 조영호님의 세미나를 듣고, 그동안 프로젝트를 진행하면서 이게맞나? 라고 생각했던 실타래들이 하나하나 풀리게 되면서 입을 벌린 상태로 보며 정리했었던 적이 있다. 그때의 내용을 곱씹으면서 다시 정리 해보자고 생각했다. 🎈예제(배달 앱) 🎈문제점 사용자가 메뉴를 고름 → 장바구니에 담음 → 이 때 업소에서 해당 메뉴를 변경시킨다. 이 때,가게의 메뉴와 장바구니에 담긴 내용이 다르므로 Validation Check가 필요하다. 🎈Valication 체크 위와 같은 관계에는 방향성이 필요하다. 방향이 잡히면 이는 곧 의존성의 방향이된다. 참고영상
-
우아한 객체지향 [우아한테크세미나] 정리 1
😊개요 한창 프로젝트를 하며 스프링과 객체지향을 접하고 활용 했을 때, 의존성에 관한 고민을 매우 많이 했었다. 그러던 도중 유튜브에서 우아한 객체지향 by 조영호님의 세미나를 듣고, 그동안 프로젝트를 진행하면서 이게맞나? 라고 생각했던 실타래들이 하나하나 풀리게 되면서 입을 벌린 상태로 보며 정리했었던 적이 있다. 그때의 내용을 곱씹으면서 다시 정리 해보자고 생각했다. 🎈의존성을 이용해 설계 진화시키기 설계 → 코드를 어떻게 배치할 것인가? → 핵심은 변경에 초점을 맞춘다. 같이변경되는 코드를 같이 넣고 변경되지 않는코드를 따로 넣어야 한다. 의존성 의존성이 있다라는 것은 위의 그림에서 B가 변경될 때 A도 함께 변경될 가능성이 있는 것을 말한다. 하지만 꼭 영향을 주는 것이 아니라 가능성이 있는 것을..
자바
-
👶주니어 자바 개발자를 위한 100가지 질문 - Internet, Spring
평소에 조금씩 자바 공부를 하고 있는데 기초적인 부분에 대해 너무 많이 모른다는 생각을 자주 했다. 그러던 와중 커리어리에 올라와 있는 조서희님의 주니어 자바 개발자를 위한 100가지 질문이라는 글을 보았다. 글을 보니 아직 모르는 내용도 많고 중요한 내용도 많은 것 같아 따로 정리하려고 한다. 처음 보시는 분들은 질문에 대해 먼저 고민해보고 토글을 열어 보는 것을 추천한다. 또한 답변의 정확하지 않을 수 있으므로 피드백은 환영! 🕸️ internet 📌 301과 302 상태 코드의 의미와 차이는 무엇인가요? 더보기 301과 302는 Redirection 동작을 의미한다. 웹페이지를 새로운 도메인으로 옮겼을 경우 이용자들을 변경된 주소로 자동으로 옮겨가게 만드는데 사용한다. HTTP프로토콜에서 해당 상태..
-
👶주니어 자바 개발자를 위한 100가지 질문 - java Web, 예외클래스
평소에 조금씩 자바 공부를 하고 있는데 기초적인 부분에 대해 너무 많이 모른다는 생각을 자주 했다. 그러던 와중 커리어리에 올라와 있는 조서희님의 주니어 자바 개발자를 위한 100가지 질문이라는 글을 보았다. 글을 보니 아직 모르는 내용도 많고 중요한 내용도 많은 것 같아 따로 정리하려고 한다. 처음 보시는 분들은 질문에 대해 먼저 고민해보고 토글을 열어 보는 것을 추천한다. 또한 답변의 정확하지 않을 수 있으므로 피드백은 환영! 🕸️Java Web 📌 jsp와 servlet의 차이점은 무엇인가요? 더보기 JavaServerPage JSP는 HTML 내부에 자바 코드를 잡입하는 형식으로 서블릿을 활용하여 웹 프로그래밍을 할 수 있지만, 화면 인터페이스 구현에 너무 많은 코드가 필요하므로 서블릿을 작성하지..
-
👶주니어 자바 개발자를 위한 100가지 질문 - Reflection, Object Copy
주니어 자바 개발자를 위한 100가지 질문 평소에 조금씩 자바 공부를 하고 있는데 기초적인 부분에 대해 너무 많이 모른다는 생각을 자주 했다. 그러던 와중 커리어리에 올라와 있는 조서희님의 주니어 자바 개발자를 위한 100가지 질문이라는 글을 보았다. 글을 보니 아직 모르는 내용도 많고 중요한 내용도 많은 것 같아 따로 정리하려고 한다. 처음 보시는 분들은 질문에 대해 먼저 고민해보고 토글을 열어 보는 것을 추천한다. 또한 답변의 정확하지 않을 수 있으므로 피드백은 환영! 🪢reflection 📌 reflection이란 무엇인가요? 더보기 Reflection이란? 리플렉션은 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API를 말하며, 컴파일..
-
👶주니어 자바 개발자를 위한 100가지 질문-Container, Multi-Threading
평소에 조금씩 자바 공부를 하고 있는데 기초적인 부분에 대해 너무 많이 모른다는 생각을 자주 했다. 그러던 와중 커리어리에 올라와 있는 조서희님의 주니어 자바 개발자를 위한 100가지 질문이라는 글을 보았다. 글을 보니 아직 모르는 내용도 많고 중요한 내용도 많은 것 같아 따로 정리하려고 한다. 처음 보시는 분들은 질문에 대해 먼저 고민해보고 토글을 열어 보는 것을 추천한다. 또한 답변의 정확하지 않을 수 있으므로 피드백은 환영! 📦Container 📌 자바 컨테이너란 무엇인가요? 더보기 자바 컨테이너란, 객체들을 저장하기 위한 저장소(객체)이다. 배열은, 원시타입의 배열을 쓸 때, 크기를 미리 선언하는데, 이는 한 번 정해지면 바꿀 수 없으므로 이에 따른 제약이 생긴다. 자바 컨테이너는 이를 해결할 수..
-
👶주니어 자바 개발자를 위한 100가지 질문-기초
주니어 자바 개발자를 위한 100가지 질문 평소에 조금씩 자바 공부를 하고 있는데 기초적인 부분에 대해 너무 많이 모른다는 생각을 자주 했다. 그러던 와중 커리어리에 올라와 있는 조서희님의 주니어 자바 개발자를 위한 100가지 질문이라는 글을 보았다. 글을 보니 아직 모르는 내용도 많고 중요한 내용도 많은 것 같아 따로 정리하려고 한다. 처음 보시는 분들은 질문에 대해 먼저 고민해보고 토글을 열어 보는 것을 추천한다. 또한 답변의 정확하지 않을 수 있으므로 피드백은 환영! 기초 📌 JDK와 JRE의 차이점은 무엇입니까? 더보기 JRE(Java Runtime Envieronment): 자바 실행 환경이다. JVM(Java Virtual Machine)와 Java binaries, java 클래스 라이브러리..
-
자바 코드 컨벤션 (2)
아래의 글은 네이버 캠퍼스 핵데이 Java 코딩 컨벤션을 기준으로 작성된 글입니다. ▶중괄호 K&R 스타일로 중괄호 선언 클래스 선언, 메서드 선언, 조건/반복문 등의 코드 블럭을 감싸는 중괄호에 적용되는 규칙이다. 중괄호 선언은 K&R 스타일을 따른다. 줄의 마지막에서 시작 중괄호를 ‘{’ 를 쓰고 열고 새줄을 삽입한다. 블럭을 마친후에는 새줄 삽입 후 중괄호를 닫는다. else, catch, finally, while(do while)은 닫는 중괄호와 같은 줄에 선언 //Bad Example public class SearchConditionParser { public boolean isValidExpression(String exp) { if (exp == null) { return false; }..
-
자바 코드 컨벤션 (1)
아래의 글은 네이버 캠퍼스 핵데이 Java 코딩 컨벤션을 기준으로 작성된 글입니다. 📁파일 공통 요건 파일 끝에 개행 추가 파일의 마지막은 새줄 문자 LF로 끝나야한다. POSIX에 명시되어 있으며, 모든 표준이 이에 따르므로 오류가 발생할 수 있다. 🆕이름 대문자로 표기할 약어 명시 약어의 중간단어를 소문자로 표기하고 프로젝트 별로 모두 대문자로 표기할 약어의 목록을 명시하는 방식이 가독성을 높이고 규칙을 단순화하는데 유리하다. 패키지 이름은 소문자로 구성 패키지 이름은 소문자를 사용하여 작성한다. 단어별 구분을 위해 언더바나 대문자를 섞지 않는다. //Bad Example package com.navercorp.apiGateway package com.navercorp.api_gateway //Goo..
알고리즘
-
백준 2668 숫자고르기[JAVA]Algorithm
🔗링크 2668 숫자고르기 Gold5 ⚠️문제 세로 두 줄, 가로로 N개의 칸으로 이루어진 표가 있다. 첫째 줄의 각 칸에는 정수 1, 2, …, N이 차례대로 들어 있고 둘째 줄의 각 칸에는 1이상 N이하인 정수가 들어 있다. 첫째 줄에서 숫자를 적절히 뽑으면, 그 뽑힌 정수들이 이루는 집합과, 뽑힌 정수들의 바로 밑의 둘째 줄에 들어있는 정수들이 이루는 집합이 일치한다. 이러한 조건을 만족시키도록 정수들을 뽑되, 최대로 많이 뽑는 방법을 찾는 프로그램을 작성하시오. 예를 들어, N=7인 경우 아래와 같이 표가 주어졌다고 하자. 이 경우에는 첫째 줄에서 1, 3, 5를 뽑는 것이 답이다. 첫째 줄의 1, 3, 5밑에는 각각 3, 1, 5가 있으며 두 집합은 일치한다. 이때 집합의 크기는 3이다. 만약 ..
-
백준 1106 호텔[JAVA]Algorithm
🔗링크 1106 호텔 Gold5 ⚠️문제 세계적인 호텔인 형택 호텔의 사장인 김형택은 이번에 수입을 조금 늘리기 위해서 홍보를 하려고 한다. 형택이가 홍보를 할 수 있는 도시가 주어지고, 각 도시별로 홍보하는데 드는 비용과, 그 때 몇 명의 호텔 고객이 늘어나는지에 대한 정보가 있다. 예를 들어, “어떤 도시에서 9원을 들여서 홍보하면 3명의 고객이 늘어난다.”와 같은 정보이다. 이때, 이러한 정보에 나타난 돈에 정수배 만큼을 투자할 수 있다. 즉, 9원을 들여서 3명의 고객, 18원을 들여서 6명의 고객, 27원을 들여서 9명의 고객을 늘어나게 할 수 있지만, 3원을 들여서 홍보해서 1명의 고객, 12원을 들여서 4명의 고객을 늘어나게 할 수는 없다. 각 도시에는 무한 명의 잠재적인 고객이 있다. 이때..
-
백준 1765 닭싸움 팀 정하기[JAVA]Algorithm
🔗링크 1765 닭싸움 팀 정하기 Gold2 ⚠️문제 닭싸움은 월드의 전통이다. 이번 캠프에서도 어김없이 닭싸움 대회가 열렸다. 그런데, 닭싸움을 하기 위해서는 반드시 누가 우리 편이고, 누가 우리 편이 아닌지를 알아야 할 것이다. 닭싸움의 팀을 정하는 원칙은, 평소 학생들의 인간관계에 따라 다음과 같이 정리할 수 있다. 내 친구의 친구는 내 친구이다. 내 원수의 원수도 내 친구이다. 이 때 두 학생이 친구이면 같은 팀에 속해있어야 하며, 같은 팀에 속해 있는 사람들끼리는 전부 친구여야 한다. 학생들의 인간관계가 주어지면, 닭싸움을 위한 팀 정하기를 할 때, 최대 얼마나 많은 팀이 만들어질 수 있는지 알아내는 프로그램을 작성하시오. 입력 첫째 줄에 학생의 수 n이 주어진다. 각 학생들은 1부터 n까지 번..
-
백준 1068 트리[JAVA]Algorithm
🔗링크 1068 트리 Gold5 ⚠️문제 트리에서 리프 노드란, 자식의 개수가 0인 노드를 말한다. 트리가 주어졌을 때, 노드 하나를 지울 것이다. 그 때, 남은 트리에서 리프 노드의 개수를 구하는 프로그램을 작성하시오. 노드를 지우면 그 노드와 노드의 모든 자손이 트리에서 제거된다. 예를 들어, 다음과 같은 트리가 있다고 하자. 현재 리프 노드의 개수는 3개이다. (초록색 색칠된 노드) 이때, 1번을 지우면, 다음과 같이 변한다. 검정색으로 색칠된 노드가 트리에서 제거된 노드이다. 이제 리프 노드의 개수는 1개이다. 입력 첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (..
-
백준 18430 무기공학[JAVA]Algorithm
🔗링크 18430 무기 공학 gold4 ⚠️문제 공학자 길동이는 외부의 침략으로부터 마을을 지킬 수 있는 부메랑 무기를 개발하는 공학자다. 길동이는 부메랑 제작을 위한 고급 나무 재료를 구했다. 이 나무 재료는 NxM크기의 직사각형 형태이며 나무 재료의 부위마다 그 강도가 조금씩 다르다. 예를 들어 나무 재료의 크기가 2x3일 때는 다음과 같이 총 6칸으로 구성된다. 길동이는 이처럼 넓은 사각형 형태의 나무 재료를 잘라서 여러 개의 부메랑을 만들고자 한다. 그리고 부메랑은 항상 3칸을 차지하는 ‘ㄱ’모양으로 만들어야 한다. 따라서 부메랑의 가능한 모양은 다음과 같이 총 4가지다. 이때 부메랑의 중심이 되는 칸은 강도의 영향을 2배로 받는다. 위 그림에서 노란색으로 칠한 부분이 ‘중심이 되는 칸’이다. 예..
최신글
-
카프카 튜토리얼- 따라해보며 이해하기
카프카란 무엇인가?아파치 카프카(Apache Kafka)는 대용량 데이터 스트리밍을 처리하기 위한 오픈 소스 플랫폼으로, 분산형 메시지 큐 시스템이다. 2010년에 LinkedIn에서 개발된 후, 아파치 소프트웨어 재단에 기부되어 현재까지 널리 사용되고 있다. 카프카는 데이터 흐름을 관리하고 실시간 처리를 가능하게 하여, 다양한 데이터 소스와 애플리케이션 간의 연결을 효율적으로 지원한다. 카프카의 주요 구성요소프로듀서(Producer): 데이터를 카프카 클러스터에 전송하는 역할을 한다.컨슈머(Consumer): 카프카에서 데이터를 읽어오는 역할을 한다.브로커(Broker): 카프카 클러스터를 구성하는 서버로, 데이터를 저장하고 프로듀서와 컨슈머 간의 메시지를 중개한다.주제(Topic): 메시지가 저장되..
-
헥사고날 아키텍처 with SpringBoot
헥사고날 아키텍쳐위의 그림은 헥사고날 아키텍쳐를 검색하면 가장 많이 나오는 그림이다. 해당 그림만 볼 때는 어떤 걸 말하려는 거지? Port-Adapter 패턴을 활용해? 개발 주니어인 나에게 해당 그림은 어렵게만 다가왔었다. 사실 해당 내용은 그렇게 어렵지 않은 개념일 수도 있다. 결론만 말하면 기존 레이어 아키텍처에서 도메인 엔티티가 의존 해야 했던 객체들을 의존성 역전을 통해 가장 중요한 도메인을 메인으로 하여 개발이 이루어질 수 있도록 한 디자인 패턴이다. 위의 그림이 Port-Adapter 패턴을 잘 표현한 그림이라 할 수 있다. 하지만 특정 포트는 특정 업무를 담당해야 한다.(인터페이스를 통한 의존성 역전) 전자 기기들은 어떤 전자기기의 형태이든 상관없이 USB형태를 가지고 있으면 된다. 레..
-
[DATABASE, MYSQL]DB 인덱스, 쿼리 튜닝
개요 인덱스 튜닝은 데이터베이스 성능 최적화의 중요한 부분으로, 인덱스를 효과적으로 사용하여 쿼리 성능을 향상시키는 작업이다. 인덱스는 데이터베이스 테이블의 특정 열에 대해 빠른 검색을 가능하게 하는 자료 구조이며, 올바르게 구성된 인덱스는 데이터 접근 시간을 크게 줄일 수 있다. MySQL을 기준으로 어떻게 기존 데이터베이스의 인덱스를 통해 속도, 성능을 개선할 수 있는지 알아보기로 했다. 옵티마이저 데이터베이스를 튜닝하기에 앞서 가장 먼저 알아야 할 요소는 옵티마이저이다.데이터베이스 관리 시스템(DBMS)의 핵심 구성 요소 중 하나로, SQL 쿼리의 실행 계획을 최적화하여 성능을 향상시키는 역할을 한다.파서를 통해 sql을 최소단위로 분리한 후, 옵티마이저를 통해 비용을 계산(join, sort, ..
-
[Spring Security] 스프링 시큐리티 권한처리 하기
스프링 시큐리티 인증 및 권한처리 개요스프링에서 시큐리티를 활용한 인증 권한을 거치면 해당 사용자는 위 사진과 같은 과정을 통해 권한을 얻게 된다. 인증 / 인가 과정 중에 SecurityContextHolder 내부에 인증 객체를 저장하는데 이 인증 객체 내부에서 일반적으로 사용되는 UserDetails 내 getAuthorities()를 통해 해당 유저의 권한을 확인 할 수 있다. 코드를 통해서도 아래와 같은 방식으로 권한을 확인할 수 있다.if (authentication.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_ADMIN"))) { redirectStrategy.sendRedirect(request, response, "/adm..
-
[스프링 부트 + 시큐리티 + REST] STOMP를 통한 채팅 구현(JWT를 통한 사용자 인증)
개요스프링 부트를 활용하여 채팅 기능이 포함된 프로젝트를 구현 하였다. STOMP를 활용했고, 스프링 시큐티리와 JWT를 통해 채팅 구현 내용과 사용자 인증 과정 및 코드를 공유한다. STOMP란?웹 소켓, TCP와 같이 양방향 네트워크 프로토콜 위에서 사용되는 서브 프로토콜이다. websocket을 통해 직접 구현하기 보다 메시지를 편리하게 사용하도록 구현되어 있는 STOMP를 활용하였다. 주요 특징 및 개념텍스트 기반 프로토콜:STOMP는 텍스트 기반 프로토콜로, 프레임(frame)이라고 불리는 명령어를 텍스트 형식으로 전달한다. 각 프레임은 명령어, 헤더, 본문으로 구성된다.프레임 구조:명령어(Command): CONNECT, SEND, SUBSCRIBE, UNSUBSCRIBE, BEGIN, CO..
-
백준 - 1533 길의 개수 JAVA
🎲문제 주소: 백준 1533 세준이는 정문이를 데리러 공항으로 가기로 했다. 하지만, 방금 세준이는 정문이의 비행기가 연착된다는 전화를 받았다. 세준이는 정문이가 정확하게 몇 분 늦는지 알고 있고, 그 시간 동안 밖에서 드라이브를 하려고 한다. 정문이가 늦는 시간을 T라고 하자. 세준이는 자기가 지금 있는 위치에서부터, 공항까지 정확하게 T분만에 도착하는 경로의 개수를 구하고 싶다. 길의 정보는 인접행렬로 주어진다. A[i][j]가 0이라면 i에서 j로 가는 길이 없는 것이고, A[i][j] ≤ 5라면, 정확히 그 만큼의 시간이 걸리는 i에서 j로 가는 길이 있는 것이다. 📲입력 첫째 줄에 교차점의 개수 N이 주어진다. N은 10보다 작거나 같고, 시작점의 위치 S와 끝점의 위치 E, 그리고 정문이가 늦..
-
스프링 시큐리티 + Github Oauth + RESTAPI + JWT 활용(With Gradle)
개요 이전에 개발 동아리 홈페이지 제작 프로젝트 중에 깃허브를 활용하여 동아리 회원 인증을 하자는 의견으로 Github Oauth + RestAPI + JWT 구현 했던 내용을 정리한다. 굳이 Github OAuth를 사용해야 했던 이유 동아리의 모든 인원이 github가입이 필수 홈페이지에 github api와 연동해야 했음(깃허브 커밋시 활동 포인트 증가 기능) 소개 JWT의 동작의 장점은 따로 세션 서버를 구성하지 않고도 확장성이 뛰어나다는 점이다. 또한 토큰을 서버에서 관리하지 않고 클라이언트 쪽에서 관리하기 때문에 서버 쪽 부담이 적다. 기본적으로 스프링 시큐리티는 세션 기반으로 동작한다. 이를 JWT 기반 동작으로 변경해야 하는데, 시큐리티는 변화에 유연하기 때문에 기존 동작들을 사용자가 원하..
-
[Spring] 롬복을 사용한 Builder 패턴 Null체크 하며 사용하기
😒개요 기존 코드가 롬복의 @Builder를 사용하여 빌더 패턴을 구현했는데, 사용하다 보니 필드 값이 많아 질 때, 대충 맞겠지 하면서 값을 입력했더니, 개발하다 보니 Builder를 통해 인스턴스 생성시, 나중에 null이 들어가는 부분이 계속 생겨났다. 그냥 내 실수려니 하고 넘어가다가 반복되니, 이건 코드의 문제다 싶어서, 객체 초기화 할 때, 간단하게 필수 값을 검증해야겠다! 라는 생각부터 시작되게 되었다. 이런 식의 코드처럼.. title을 빼먹는다거나… 👍해결방법 1. 직접 Null 체크 가장 직접적인 방법은 Null체크 하는 메서드를 실제로 만들어서 체크하는 방법이다. class Post { private final String title; private final String conten..
-
우아한 객체지향 [우아한테크세미나] 정리 5
😊개요 한창 프로젝트를 하며 스프링과 객체지향을 접하고 활용 했을 때, 의존성에 관한 고민을 매우 많이 했었다. 그러던 도중 유튜브에서 우아한 객체지향 by 조영호님의 세미나를 듣고, 그동안 프로젝트를 진행하면서 이게맞나? 라고 생각했던 실타래들이 하나하나 풀리게 되면서 입을 벌린 상태로 보며 정리했었던 적이 있다. 그때의 내용을 곱씹으면서 다시 정리 해보자고 생각했다. 다음과 같이 변경하게되면 기존에 적었던 메서드들이 모두 컴파일에러를 띄울것이다. 연관관계로 참조했던 것들이 객체를 끊어버리게 되니깐 Entity내부에서 구현했던 연관관계 객체들에서 error를 반환한다. Id로 참조하는 공통 로직을 객체를 새로 생성해 하나에 몰아 넣는다. 🎈과연 이렇게 하는 것이 좋은 변경일까? 객체 지향은 여러객체를 ..
-
우아한 객체지향 [우아한테크세미나] 정리 4
😊개요 한창 프로젝트를 하며 스프링과 객체지향을 접하고 활용 했을 때, 의존성에 관한 고민을 매우 많이 했었다. 그러던 도중 유튜브에서 우아한 객체지향 by 조영호님의 세미나를 듣고, 그동안 프로젝트를 진행하면서 이게맞나? 라고 생각했던 실타래들이 하나하나 풀리게 되면서 입을 벌린 상태로 보며 정리했었던 적이 있다. 그때의 내용을 곱씹으면서 다시 정리 해보자고 생각했다. 🎈설계 개선하기 설계를 진화시키기 위한 출발점 코드 작성 후 의존성 관점에서 설계 검토 → shop과 order에서 사이클이 발생한다. 🎈해결 1. 중간 객체를 이용한 의존성 사이클 끊기 어떻게 보면 DIP의 변형이라 볼 수 있다. 의존성을 끊고 장바구니에서도 OptionGroup과 Option을 활용할 수 있으므로 재사용성이 증가한다...
-
우아한 객체지향 [우아한테크세미나] 정리 3
😊개요 한창 프로젝트를 하며 스프링과 객체지향을 접하고 활용 했을 때, 의존성에 관한 고민을 매우 많이 했었다. 그러던 도중 유튜브에서 우아한 객체지향 by 조영호님의 세미나를 듣고, 그동안 프로젝트를 진행하면서 이게맞나? 라고 생각했던 실타래들이 하나하나 풀리게 되면서 입을 벌린 상태로 보며 정리했었던 적이 있다. 그때의 내용을 곱씹으면서 다시 정리 해보자고 생각했다. 🎈관계의 종류 결정하기 연관관계 → 영구적인 탐색구조가 필요하다면 연관관계로 잡는다. 위와 같은관계에서 만약 Order랑 Shop이랑 굉장히 빈번하게 호출이 발생한다면 연관관계로 잡는것이 좋다. 의존관계 → 협력을 위해 일시적으로 필요한 의존성(파라미터, 리턴타입, 지역변수) → 연관관계는 탐색 가능성을 말하며 두 객체사이에 협력이 필요..
-
우아한 객체지향 [우아한테크세미나] 정리 2
😊개요 한창 프로젝트를 하며 스프링과 객체지향을 접하고 활용 했을 때, 의존성에 관한 고민을 매우 많이 했었다. 그러던 도중 유튜브에서 우아한 객체지향 by 조영호님의 세미나를 듣고, 그동안 프로젝트를 진행하면서 이게맞나? 라고 생각했던 실타래들이 하나하나 풀리게 되면서 입을 벌린 상태로 보며 정리했었던 적이 있다. 그때의 내용을 곱씹으면서 다시 정리 해보자고 생각했다. 🎈예제(배달 앱) 🎈문제점 사용자가 메뉴를 고름 → 장바구니에 담음 → 이 때 업소에서 해당 메뉴를 변경시킨다. 이 때,가게의 메뉴와 장바구니에 담긴 내용이 다르므로 Validation Check가 필요하다. 🎈Valication 체크 위와 같은 관계에는 방향성이 필요하다. 방향이 잡히면 이는 곧 의존성의 방향이된다. 참고영상
-
우아한 객체지향 [우아한테크세미나] 정리 1
😊개요 한창 프로젝트를 하며 스프링과 객체지향을 접하고 활용 했을 때, 의존성에 관한 고민을 매우 많이 했었다. 그러던 도중 유튜브에서 우아한 객체지향 by 조영호님의 세미나를 듣고, 그동안 프로젝트를 진행하면서 이게맞나? 라고 생각했던 실타래들이 하나하나 풀리게 되면서 입을 벌린 상태로 보며 정리했었던 적이 있다. 그때의 내용을 곱씹으면서 다시 정리 해보자고 생각했다. 🎈의존성을 이용해 설계 진화시키기 설계 → 코드를 어떻게 배치할 것인가? → 핵심은 변경에 초점을 맞춘다. 같이변경되는 코드를 같이 넣고 변경되지 않는코드를 따로 넣어야 한다. 의존성 의존성이 있다라는 것은 위의 그림에서 B가 변경될 때 A도 함께 변경될 가능성이 있는 것을 말한다. 하지만 꼭 영향을 주는 것이 아니라 가능성이 있는 것을..
-
Redis? 언제 쓰는건데?
현재 웹 프로젝트 진행중인데 refreshToken을 저장할 때 Redis를 사용한다. 중요한 데이터가 아닌 것과, expireDate를 설정할 수있기에 Redis를 사용했지만 다양한 경우에도 Redis를 사용한다는 것을 알게 되었다. 기존 Redis에 대해 알고있던 정보는 in-memory라 빠르다. 캐시로 많이 사용한다. 싱글 쓰레드이다. 정도 알고 있지만, 그래서 어떤 경우에 쓸 수 있는지, 어떻게 쓰는건지에 대해서는 잘 몰랐기에 한 번 조사해보았다. Redis란? redis는 in-memory key-value storage로 주로 DB 레이어의 부하 분산과 빠른 응답을 위한 캐싱 레이어로 쓰인다.\ 특징 디스크가 아닌 메모리 기반의 data저장소 → 휘발성 (서버를 재시작하면 데이터가 날아감) ..
-
백준 2668 숫자고르기[JAVA]
🔗링크 2668 숫자고르기 Gold5 ⚠️문제 세로 두 줄, 가로로 N개의 칸으로 이루어진 표가 있다. 첫째 줄의 각 칸에는 정수 1, 2, …, N이 차례대로 들어 있고 둘째 줄의 각 칸에는 1이상 N이하인 정수가 들어 있다. 첫째 줄에서 숫자를 적절히 뽑으면, 그 뽑힌 정수들이 이루는 집합과, 뽑힌 정수들의 바로 밑의 둘째 줄에 들어있는 정수들이 이루는 집합이 일치한다. 이러한 조건을 만족시키도록 정수들을 뽑되, 최대로 많이 뽑는 방법을 찾는 프로그램을 작성하시오. 예를 들어, N=7인 경우 아래와 같이 표가 주어졌다고 하자. 이 경우에는 첫째 줄에서 1, 3, 5를 뽑는 것이 답이다. 첫째 줄의 1, 3, 5밑에는 각각 3, 1, 5가 있으며 두 집합은 일치한다. 이때 집합의 크기는 3이다. 만약 ..
-
👶주니어 자바 개발자를 위한 100가지 질문 - Internet, Spring
평소에 조금씩 자바 공부를 하고 있는데 기초적인 부분에 대해 너무 많이 모른다는 생각을 자주 했다. 그러던 와중 커리어리에 올라와 있는 조서희님의 주니어 자바 개발자를 위한 100가지 질문이라는 글을 보았다. 글을 보니 아직 모르는 내용도 많고 중요한 내용도 많은 것 같아 따로 정리하려고 한다. 처음 보시는 분들은 질문에 대해 먼저 고민해보고 토글을 열어 보는 것을 추천한다. 또한 답변의 정확하지 않을 수 있으므로 피드백은 환영! 🕸️ internet 📌 301과 302 상태 코드의 의미와 차이는 무엇인가요? 더보기 301과 302는 Redirection 동작을 의미한다. 웹페이지를 새로운 도메인으로 옮겼을 경우 이용자들을 변경된 주소로 자동으로 옮겨가게 만드는데 사용한다. HTTP프로토콜에서 해당 상태..
-
👶주니어 자바 개발자를 위한 100가지 질문 - java Web, 예외클래스
평소에 조금씩 자바 공부를 하고 있는데 기초적인 부분에 대해 너무 많이 모른다는 생각을 자주 했다. 그러던 와중 커리어리에 올라와 있는 조서희님의 주니어 자바 개발자를 위한 100가지 질문이라는 글을 보았다. 글을 보니 아직 모르는 내용도 많고 중요한 내용도 많은 것 같아 따로 정리하려고 한다. 처음 보시는 분들은 질문에 대해 먼저 고민해보고 토글을 열어 보는 것을 추천한다. 또한 답변의 정확하지 않을 수 있으므로 피드백은 환영! 🕸️Java Web 📌 jsp와 servlet의 차이점은 무엇인가요? 더보기 JavaServerPage JSP는 HTML 내부에 자바 코드를 잡입하는 형식으로 서블릿을 활용하여 웹 프로그래밍을 할 수 있지만, 화면 인터페이스 구현에 너무 많은 코드가 필요하므로 서블릿을 작성하지..
-
👶주니어 자바 개발자를 위한 100가지 질문 - Reflection, Object Copy
주니어 자바 개발자를 위한 100가지 질문 평소에 조금씩 자바 공부를 하고 있는데 기초적인 부분에 대해 너무 많이 모른다는 생각을 자주 했다. 그러던 와중 커리어리에 올라와 있는 조서희님의 주니어 자바 개발자를 위한 100가지 질문이라는 글을 보았다. 글을 보니 아직 모르는 내용도 많고 중요한 내용도 많은 것 같아 따로 정리하려고 한다. 처음 보시는 분들은 질문에 대해 먼저 고민해보고 토글을 열어 보는 것을 추천한다. 또한 답변의 정확하지 않을 수 있으므로 피드백은 환영! 🪢reflection 📌 reflection이란 무엇인가요? 더보기 Reflection이란? 리플렉션은 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API를 말하며, 컴파일..
-
👶주니어 자바 개발자를 위한 100가지 질문-Container, Multi-Threading
평소에 조금씩 자바 공부를 하고 있는데 기초적인 부분에 대해 너무 많이 모른다는 생각을 자주 했다. 그러던 와중 커리어리에 올라와 있는 조서희님의 주니어 자바 개발자를 위한 100가지 질문이라는 글을 보았다. 글을 보니 아직 모르는 내용도 많고 중요한 내용도 많은 것 같아 따로 정리하려고 한다. 처음 보시는 분들은 질문에 대해 먼저 고민해보고 토글을 열어 보는 것을 추천한다. 또한 답변의 정확하지 않을 수 있으므로 피드백은 환영! 📦Container 📌 자바 컨테이너란 무엇인가요? 더보기 자바 컨테이너란, 객체들을 저장하기 위한 저장소(객체)이다. 배열은, 원시타입의 배열을 쓸 때, 크기를 미리 선언하는데, 이는 한 번 정해지면 바꿀 수 없으므로 이에 따른 제약이 생긴다. 자바 컨테이너는 이를 해결할 수..
-
스프링부트 페이징처리하기(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..