전체 글 89

[Spring boot + AWS S3] 이미지 저장하기(프로필, 게시글 이미지)

💡 프로젝트 환경 spring boot 3.2.2 spring-cloud-starter-aws:2.2.6.RELEASE 1-1. AWS S3 버킷 만들기 1) aws 콘솔에서 회원가입 후 S3 검색해 버킷을 만듦 https://aws.amazon.com/ko/console/ AWS Management Console AWS Support 플랜은 AWS로 성공하는 데 도움이 되는 다양한 도구, 프로그램 및 전문 지식에 대한 액세스의 조합을 제공합니다. aws.amazon.com 실무에서는 보통 액세스 차단을 한다고 함, 테스트를 위해서 퍼블릭 상태로 둠 2) 버킷 정책 생성 권한 - 버킷 정책 편집 - 정책 생성기 클릭 Actions에는 GetObject 선택해주면 됨 현재 이미 정책을 생성해놓아서 유효하지..

[회고][프로젝트 5~12일차] 다시 1일차로 돌아간 이야기

패기롭게 주어진 자료를 참고해서 JWT, Security를 써보면서 유저기능(회원가입, 로그인, 로그아웃) 구현을 끝냈었다. 하지만 내가 참고하던 자료는 필터를 너무나도 많이 커스텀해서 쓰고 있었고 유저기능 구현을 다 하고 나서 다른 기능을 구현하려니 자꾸 막혔다. 문제는 커스텀한 필터에 대한 이해도가 없어서 내 프로젝트에 맞게 어떤식으로 적용해야 할지를 모르겠다는 거였다. 거기다가 뷰까지 만들어서 연결을 하려고 하니 도저히 진도가 나가지 않아서 과감한 선택이 필요했다. 그래서 7일차에 결심하고 기존 프로젝트를 엎어서 8일차부터 다시 시작했다. 타임라인을 정리해보자면 1/31 ~ 2/1 💡 스프링부트 입문 강의 완강 스프링 부트 프로젝트 설정, 구조에 대한 이해 mvc 패턴 이용한 컨트롤러 작성 rest..

[회고][프로젝트 2~4일차] 회원가입, 로그인 기능 구현

✅ 로그인 시 JWT 토큰 발급 JWT 생성 시 쿠키 생성하여 Client의 Header에 추가 ✅ Security Role(ADMIN / USER) 나누기 페이지별 권한 처리 [앞으로 보충해야 할 일] 👉 회원가입 시 ADMIN 권한 부여 하는 방법 👉 thymeleaf-springsecurity 이용해서 권한에 따른 버튼 활성화/비활성화 처리 ✅ 간단하게 화면단 만들어서 연결 메인페이지, 회원가입, 로그인 페이지 구현(thymeleaf 이용) 저번 프로젝트때는 화면단을 React로 하면서 페이지 이동을 화면단에서 다 하다보니 화면단 만들고 ajax 쓰는데 좀 헤맸음 thymeleaf는 처음 이용해보는데 조금만 문법 잘못 쓰면 바로 에러 나서 당황했다. 근데 security랑 같이 쓰기 좋다하고, 나름..

[spring security] 로그아웃 기능 구현

로그인은 JWT 생성한 서버에서 쿠키를 직접 생성해 Client의 Header로 전달하는 방식으로 구현했다. 로그아웃은 어떻게 할 것인가? 한번 발급된 토큰은 만료될때까지 삭제가 되지 않기 때문에 쿠키에서 지워주는 방식으로 구현할 것이다. Handling Logouts :: Spring Security If you are using Java configuration, you can add clean up actions of your own by calling the addLogoutHandler method in the logout DSL, like so: Custom Logout Handler CookieClearingLogoutHandler cookies = new CookieClearingLogou..

[회고][프로젝트 1일차] 환경 세팅, API 명세서 작성, ERD 설계, 테이블 생성

오늘의 한 일 ✅ 환경 세팅 - 프로그래밍 언어: Java 17 - 빌드 툴: Gradle - 프레임워크: Spring boot 3.2.2 - 데이터베이스: MySQL 8.0.36 - ORM: JDBC - JPA ✅ API 명세서 작성 노션에 작성해둠, 계속해서 수정할 예정 - 회원가입, 로그인 - 마이페이지 - 게시물 - 댓글 - 게시물 좋아요 - 댓글 좋아요 - 팔로우 ✅ ERD 설계 ✅ DB 작업 - 테이블 및 컬럼 생성(시퀀스, PK, UNIQUE ) - FK 지정(CASCADE) 설정 👉 테이블 DROP할 때 FK 고려해서 순서 중요함! 회고 1. 개인 프로젝트는 처음이라 환경 세팅부터 결정할 것이 너무 많다. 모든 결정에는 이유가 있어야 한다. 2. 오늘 진짜 세팅 끝! 개발 하다보면 중간에 ..

Intellij - MySQL 연결 오류 (com.mysql.cj.jdbc.Driver)

✔️ 나의 개발 환경 - Java 17 - Spring boot 3.2.2 - MySQL 8.0.36 지난번 프로젝트때는 Oracle을 사용해서 이번엔 MySQL을 써보고자 설치를 끝냈다. 스프링 부트 새 프로젝트 생성해서 dependencies 등등 세팅을 다 끝내고 db연결을 해보려니까 갑자기 바보가 된 기분이었다. JDBC란? Java Database Connectivity의 약자로 자바 기반 애플리케이션과 데이터베이스에 저장된 데이터를 연결해주는 API이다. 연결을 위해서는 Connector를 다운받아 설정해주면 된다. 👉 데이터베이스와 연결하기 위해서 해야할 일 1. JDBC 드라이버 MySQL Connector를 다운받는다. MySQL 공식문서를 타고 들어가면 Connector 파일이 있다. ..

[baekjoon] 2212. 센서

✅ 문제 💡 문제 이해 최대 k개의 집중국의 수신 가능 영역 길이의 합의 최솟값을 구하는 문제 1. 센서를 묶어 k개의 집중국으로 나눔 2. 각 집중국 내의 센서 간 수신거리의 합이 최소가 되는 경우 = 집중국간 경계의 거리가 최대가 되는 경우 ✅ 풀이 문제 자체를 이해하는데 한참 걸렸다. 그리디 알고리즘 방식으로 접근하면 된다고는 생각했지만 실제적으로 구현이 좀 어려웠음 💡 문제 풀이 Point 1. 집중국이 k개일 때 집중국 경계 영역은 k-1개 2. 원점으로부터 거리 -> 오름차순 정렬 후 인근 센서 사이 거리 구하기 3. 센서 간 거리를 배열에 담고 오름차순하여 가장 큰 수 k-1개를 제외한 나머지 합을 구하기 아래에 예제 입력 2가지 경우를 모두 그림으로 그려 보았다. 각 센서간 거리를 구한 다..

[baekjoon] 10026. 적록색약

✅ 문제 💡 문제 이해 1. 섬 개수 구하기와 비슷하지만 R, G, B로 섬 구분 2. 적록색약의 경우 R, G 구분이 안가므로 R+G / B로 구분 3. 각 구역 수 count 후 출력 ✅ 나의 코드 💡 문제 풀이 Point 1. 적록색약의 여부를 isblind로 구분해서 dfs 탐색시 같이 넘김 2. dfs 탐색 시 2-1) 적록색약인 경우 B인 경우와 B가 아닌 경우를 나누어서 탐색 2-2) 적록색약이 아닌 경우 일반적인 dfs 탐색 import sys input = sys.stdin.readline sys.setrecursionlimit(10000) def dfs(x, y, color, isblind): for i in range(4): nx = x+dx[i] ny = y+dy[i] if 0

[baekjoon] 7562. 나이트의 이동

✅ 문제 원하는 위치로 나이트를 이동시킬 때의 최단 거리를 구하는 문제 최단 경로를 구하는 문제라서 bfs 방식으로 풀었다. ✅ 나의 코드 import sys from collections import deque input = sys.stdin.readline # 이동 좌표 dx = [-2, -1, 1, 2, -2, -1, 1, 2] dy = [1, 2, 2, 1, -1, -2, -2, -1] def bfs(x, y, x2, y2, visited): q = deque() q.append((x,y)) while q: currentX, currentY = q.popleft() if currentX == x2 and currentY == y2: # 이동이 끝나면 이동거리 -1 반환(현재 위치 제외) print..

[leetcode] 543. Diameter of Binary Tree

✅ 문제 - 두 정렬 리스트의 병합 이진트리에서 두 노드 간 가장 긴 경로의 길이를 출력하는 문제! ✅ 풀이 💡 Point 1. 1부터 시작해서 각 노드별로 좌, 우 서브트리를 dfs 방식으로 확인 2. 더이상 서브트리가 없을 경우 0 반환하고 부모 노드로 다시 올라감 3. 부모노드 기준 좌, 우 서브트리 확인하여 더 깊은 쪽 길이에 +1 4. 항상 최댓값을 반환하므로 가장 긴 길이를 출력할 수 있다. 출력 샘플 그림으로 그려보며 이해해 봤다. 1부터 시작하여 서브트리 순회를 각각 하는데, 2로 내려가면 또 4, 5 서브트리가 있으니 더 이상 서브트리가 없을 때까지 dfs 탐색을 한다. 서브트리가 없으면 0을 반환하며 다시 부모 노드로 올라가는데 이때 좌 우 트리깊이 중 더 깊은 값에 +1을 해준다. 2..