전체 글

만들어 보고 싶은 걸 만들어 보자
VPC 내에 public 서브넷과 private 서브넷이 있고, public 서브넷엔을 설정한다. 보안을 위해 일반적으로 RDS를 private 서브넷에 위치시킨다. 이렇게 하면 인터넷에서 RDS로 접속할 수 없기 때문에 보안이 향상된다. 그러나 데이터베이스 스키마를 생성하거나 설정을 변경하려면 RDS에 접속해야 한다. private 서브넷에 있는 RDS는 퍼블릭 액세스가 불가능하므로, SSH 터널링을 통한 우회 접근으로 접속해야 한다. 이 경우, public 서브넷에 위치한 EC2 인스턴스를 중간 다리 역할로 사용한다. 먼저 SSH를 통해 EC2 인스턴스에 연결한 다음, 해당 EC2 인스턴스를 경유하여 private 서브넷의 RDS에 접근한다.  내가 구글링 하여 겪은 점들을 하나 하나 기록하며 글을 ..
·JAVA
백준에서 코테를 공부하다 보니 다양한 입출력 도구들이 존재하고, 이 도구들에 대해서 공부하고자 글을 작성합니다. 백준처음 공부하시는 분들, 그 중에서 자바로 준비하시는 분들이 이 글을 보시고 입출력 도구들을 적절히  사용하시게 되는 계기가 되었음 좋겠습니다.  1. BufferedReader쉽게 말해서 Scanner의 역할, 입력을 받는 역할이라고 생각하시면 됩니다.import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class BufferedReaderExample { public static void main(String[] args) { try { ..
학교 식단 프로젝트 시 https으로 접속하기 위해서 여러 시도를 해보았고 성공했기 때문에 글을 작성한다. 이 글엔 내가 겪은 시행착오들도 적어보려고 하니 HTTPS 를 적용시키고자 하는 사람은 이 글을 읽으면서 따라해보면서 구현하면 좋을 것 같다. https 를 사용해 ec2 에 접속하는 방법은 cloudFrount 를 사용하는 방법과 ELB 를 사용하는 방법이 있다. 나의 경우 이 프로젝트를 추후에 확장시켜 출시할 예정이기 때문에 트래픽 부하 분산을 고려하여 ELB 를 사용하여 https 접속하는 방법을 선택해보았다.1. EC2 생성https 로 접속할 인스턴스를 만들어준다. 이 글을 읽는 분들은 기본적으로 EC2 생성할 줄 아는 사람들이라고 가정하고 유의할 사항만 언급해도록 하겠다. 기존 보안 그룹..
·JAVA/Spring Boot
1. 서론코딩을 조금이라도 해본 사람은 '객체지향' 이라는 단어를 들어보았을 것이다. 특히 Java는 객체지향 언어의 대표주자로 불리고 있는, 객체지향이 무엇이고 객체지향과 Spring의 관계, 그중에서도 객체지향의 핵심인 다형성에 대해 깊이 있게 알아보려고 한다. 대부분 Spring을 사용하는 개발자들은 이에 왜 Spring을 왜 사용해야 하는지 고민해본 적이 많이 없을 것 같은데 이 글을 읽고 한 번쯤 그 이유를 알아가보면 좋을 것 같다.  2. 객체지향이란?객체지향은 말 그대로 '객체'를 중심으로 프로그램을 설계하고 구현하는 방식이다. 여기서 객체란 실제 세계의 물체나 개념을 프로그래밍적으로 표현한 것을 말하는데, 객체지향엔 다양한 특징들이 있다. 객체지향의 특징을 자세히 살펴보면:캡슐화: 데이터와..
·인프라/DevOps
저는 CI/CD 를 구축하기 위해서 EC2를 사용하였습니다. 어떤 프로젝트를 사용할 지에 따라 사용해야 하는 Computing 서비스가 달라지는데 , 저는 현재 기본적인 CI/CD 구축을 목표로 하고 있으므로 비용적인 부담이 덜하는 EC2를 바탕으로 구현해보았습니다. 일단 CI/CD를 구축하기 위해선 사용하고자 하는 EC2에 기본적인 설정들이 되어있어야 합니다. 저는 Spring Boot 를 사용한 프로젝트에 대해서 CI/CD를 구축할 것이므로 EC2에 JAVA 등이 설치되어 있어야 합니다. 또한 GitHub Actions를 활용하여 CI/CD를 구축할 것이기 때문에 EC2에서 배포 스크립트를 실행할 수 있도록 필요한 권한과 환경을 설정해야 합니다. EC2에서 프로젝트를 배포하는 방법부터 살표보겠습니다...
·인프라/DevOps
CI/CD란?? 개발자가 새로운 기능을 추가거나 기존 코드를 개선할 때마다 그 변경사항을 실제 서비스에 반영하려면 여러 단계를 거쳐야 합니다:빌드 (Build): 작성한 코드를 실행 가능한 프로그램으로 만듭니다테스트 (Test): 만든 프로그램이 제대로 작동하는지 확인합니다패키징 (Packaging): 프로그램을 서버에 설치할 수 있는 형태로 묶습니다배포 (Deploy): 실제 서비스 중인 서버에 새 버전을 설치합니다이 모든 과정을 개발자가 수동으로 진행하면 너무 시간이 많이 걸리고, 실수할 가능성도 높아집니다. 게다가 여러 개발자가 함께 작업하는 경우에는 더욱 복잡해질 수 있습니다. CI/CD는 이 모든 과정을 자동화하는 시스템입니다. CI/CD를 구축한 후 개발자가 코드를 작성하고 저장소(Reposi..
출처 : https://www.youtube.com/watch?v=QWjl49py7PM&t=2s 이 글은 위 유튜브 강의를 시청하고 내가 이해한대로 작성한 글임을 알려드립니다. 소셜 로그인은 크게 3개의 단계로 구분할 수 있다. code 받기 access_token 받기3access_token 받고 사용자 정보 받기이 단계를 중심으로 소셜로그인의 구현 원리에 대해서 최대한 이해하기 쉽게 설명해 보겠다.   1. Code 받기  홈쇼핑을 운영한다고 가정하자네이버 로그인을 위해 네이버 마크를 누르게 되면(이 때 마크의 url 주소는 쇼핑몰의 로그인 페이지, 예: http://127.0.0.1:3000/oauth2/authorizaton/naver) 네이버 로그인 페이지로 리다이렉트됩니다. 이 때 쇼핑몰의 c..
#registrationspring.security.oauth2.client.registration.서비스명.client-name=서비스명spring.security.oauth2.client.registration.서비스명.client-id=서비스에서 발급 받은 아이디spring.security.oauth2.client.registration.서비스명.client-secret=서비스에서 발급 받은 비밀번호spring.security.oauth2.client.registration.서비스명.redirect-uri=서비스에 등록한 우리쪽 로그인 성공 URIspring.security.oauth2.client.registration.서비스명.authorization-grant-type=authorization..
내용 출처 : 개발자 유미(유튜브)자료 출처 : https://www.devyummi.com/page?id=66934f448a005e7d8f32213a OAuth2 Code Grant 방식의 동작 순서로그인 페이지성공 후 코드 발급 (redirect_url)코드를 통해 Access 토큰 요청Access 토큰 발급 완료Access 토큰을 통해 유저 정보 요청유저 정보 획득 완료 1. 로그인 페이지사용자가 서비스에 접근하면 로그인 페이지로 리다이렉트됩니다. 이 페이지는 보통 OAuth 제공자(예: Google, Facebook 등)가 호스팅합니다. 2. 성공 후 코드 발급 (redirect_url)사용자가 성공적으로 로그인하면, OAuth 제공자는 미리 지정된 redirect_url로 사용자를 리다이렉트시킵..
1. Spring Data JPA Auditing Spring Data JPA Auditing은 엔티티의 생성, 수정 시간, 생성자, 수정자 등의 정보를 자동으로 관리해주는 기능입니다.이를 통해 데이터의 생성 및 변경 이력을 쉽게 추적할 수 있습니다.  2. Auditing의 주요 정보:생성 시간 (createdDate)수정 시간 (lastModifiedDate)생성자 (createdBy)수정자 (lastModifiedBy)3. Auditing 설정 방법step1매인 어플리케이션에 @EnableJpaAuditing 설정@EnableJpaAuditing@SpringBootApplicationpublic class DataJpaApplication { public static void main(Stri..
출처 : 개발자 유미(유튜브) github : https://github.com/mmingoo/Spring-Security-JWT- https://ko.wikipedia.org/wiki/%EA%B5%90%EC%B0%A8_%EC%B6%9C%EC%B2%98_%EB%A6%AC%EC%86%8C%EC%8A%A4_%EA%B3%B5%EC%9C%A0 교차 출처 리소스 공유 - 위키백과, 우리 모두의 백과사전위키백과, 우리 모두의 백과사전. 교차 출처 리소스 공유(Cross-origin resource sharing, CORS), 교차 출처 자원 공유는 웹 페이지 상의 제한된 리소스를 최초 자원이 서비스된 도메인 밖의 다른 도메인으ko.wikipedia.org CORS란 프론트엔드와 백엔드가 다른 포트에서 실행되는 상황..
출처 : 개발자 유미(유튜브) jwt는 stateless로 관리되긴 하지만, 일시적인 요청에 대해서 세션을 잠시동안 생성하기 때문에 SecurityContextHolder에서 정보를 꺼낼 수 있다. 세션에서 현재 사용자 아이디를 가져오는 코드SecurityContextHolder.getContext().getAuthentication().getName();  세션에서 현재 사용자의 권하을 가져오는 코드 //사용자에게 부여된 권한(역할)들의 컬렉션입니다. 예를 들어 "ROLE_USER", "ROLE_ADMIN" 등의 권한이 포함될 수 있습니다. Collection authorities = authentication.getAuthorities(); Iterator iter = ..
main 홈페이지가 있고 admin 홈페이지가 있다고 가정하자.admin 홈페이지에 접근하기 위해선 관리자 역할이 필요한데,현재 내가 가지고 있는 역할이 admin인지 아닌지 검증하는 필터가 필요하다.  1. 커스텀 JWT 필터 등록:Spring Security의 필터 체인에 사용자 정의 필터를 추가합니다. 이 필터는 일반적으로 OncePerRequestFilter를 상속받아 구현합니다. SecurityConfig 클래스에서 이 필터를 등록합니다.2. JWT 검증 과정:필터는 모든 요청에 대해 실행됩니다. HTTP 요청 헤더에서 "Authorization" 키를 확인합니다. "Authorization" 헤더가 "Bearer "로 시작하는 JWT 토큰을 포함하고 있는지 확인합니다. 3. SecurityCo..
출처 : 개발자 유미(유튜) 이번 글에선 여태까지 작성해준 코드에 jwt를 주입하고 로그인 검증 성공 시 메서드만 작성하면 되는 것이기 때문에 제 깃허브 코드를 확인하시면 됩니다. 코드 : https://github.com/mmingoo/Spring-Security-JWT-  1. JWTUtil 주입 LoginFilter : JWTUtil 주입 package com.example.jpamysql.jwt;import com.example.jpamysql.dto.CustomUserDetails;import jakarta.servlet.FilterChain;import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServle..
출처: 개발자 유미(유튜브) 1. JWT 발급과 검증발급검증로그인에 성공한다면 jwt가 발급된다반면에 특정한 기능이나 접근엔 jwt가 유효한 지 검증하는 단계가 필요하다. 2. JWT 생성 원리다음 사진은 JWT를 나타내는 문장이다. JWT는 Header, Payload, Signature로 구성돼있다. jwt임을 알려주는 역할을 한다또한 인코딩 될 때 사용한 암호화 알고리즘을 알려준 사용자가 입력한 정보(username, password)를 담고 있다. Haeder와 Payload를 Base64방식으로 인코딩 시키고 암호화키를 합쳐서  암호화시킨 알고리즘을 뜻한다암호화된 알고리즘 : BASE64(Header) + BASE64(Payload) + 암호화3. 특징jwt는 내부 정보를 단순 BASE64 방식..
출처 : 개발자 유미(유튜브)       CustomUserService에서 loadUserByUsername정의 (username으로 repsitory를 통해 DB에서 User의 정보를 가져옴 )만약에 User의 정보가 존한다면 UserDetails에 User의 정보를 담아서 Authentication Manager에 전달 후 검증 즉 한 마디로,Spring Security를 사용하여 회원가입 시 JoinService의 joinProcess 메서드를 통해 사용자 정보를 BCrypt로 암호화하여UserRepository에 저장하고로그인 시 LoginFilter의 attemptAuthentication 메서드에서 Authentication Manager 에 user의 정보를 전달 후loadUserByUse..
출처 : 개발자 유미(유튜브) UsernamePasswordAuthentication 가 longin dto에서 username과 pawsswor를 가져온 후에 Authentication Manager에 넘겨줌Authentication Manager가 DB에서 username과 pawssword를 가져와 검증을 진행하고검증이 성공적으로 끝나면 successfulAuth 가 동작이 되면 jwt를 생성해서 사용자에게 응답해줌 클라이언트의 요청(로그인 요청)이 오면DispatcherServlet(Spring Boot Controller)으로 향하는 중간 필터에서 요청을 가로챈 후Spring Security는  검증(인증/인가)을 진행한다. (헷갈리다면 다음 사진을 참고하자) DelegatingFilter Pr..
·오류 해결
김영한님의 강의를 공부하다 보니 h2에 익숙해졌던 나는 mysql의 필요성을 깨닫고 jpa와 연동을 시도했습니다.하지만 생각보다 연동이 쉽지 않았고, 오랜 시간 끝에 연동에 성공했습니다.나와 같은 상황에 처한 분들에게 조금이라도 도움이 되고자 jpa와 mysql 연동 방법을 정리해 보았습니다. 1. Mysql Server , Mysql Workbench 설치  이 두개의 설치는 간단하니 다음 글을 통해서 설치해주세요. https://shinysblog.tistory.com/20 MySQL(workbench) 다운로드 및 설치 방법MySQL 다운로드와 workbench를 설치하는 방법을 알려드리겠습니다. dev.mysql.com/downloads/windows/installer/8.0.html MySQL ..
출처 : 개발자 유미(유튜브) 전체코드package com.example.springjwt.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.security.config.annotation.web.builders.HttpSecurity;import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;import org.springframework.security.config.http.SessionCrea..
Spring Data JPA 에선 Repository 인터페이스만 구현한다면 메서드는 스프링이 구현체를 만들어 주기 때문에 구체화할 필요가 없다. 하지만 다음의 경우 Spring Data JPA가 제공하지 않는 메서드를 구현해야 할 경우가 존재한데, 이 경우엔 어떻게 해야할까??JPA 직접 사용( EntityManager )스프링 JDBC Template 사용MyBatis 사용데이터베이스 커넥션 직접 사용Querydsl 사용 해답은별도의 인터페이스와 Repository를 만들어 인터페이스에 필요한 메서드를 선언하고, Repository에 메서드를 구현하면 된다.  인터페이스에 구현하고자 하는 메서드를 선언한다.public interface MemberRepositoryCustom { List findM..
연관관계 있는 엔터티를 조회하게 될 경우 fetch = FetchType.LAZY 처럼 LAZY로 지연로딩 설정이 되어있을 때 , 해당 엔터티(Member)만 조회하고 연관관계 있는 엔터티(Team)를 조하지 않게 된다.  이 때 Team에 대한 정보가 필요하게 될 때 Team에 대한 정보를 조회해야 하는데, 이런 상황에서 실행시킨 쿼리 외(실행시킨 쿼리는 Member에 대한 쿼리)에도 쿼리가 추가로 나가기 때문에 n+1 문제가 발생한다.   좀 더 쉽게 말해서, Member 쿼리 실행 시 연관관계 있는 Team의 경우  select 되지 않고 proxy 객체를 만들어 가상의 엔티티를 반환한다. 그 후 해당 프시 객체를 호출할 때마다 그때그때 select 쿼리가 실행된다. @EntityGraph는  Da..
문제 하지만 상근이는 새로운 비행기를 무서워하기 때문에, 최대한 적은 종류의 비행기를 타고 국가들을 이동하려고 한다. 이번 방학 동안의 비행 스케줄이 주어졌을 때, 상근이가 가장 적은 종류의 비행기를 타고 모든 국가들을 여행할 수 있도록 도와주자. 상근이가 한 국가에서 다른 국가로 이동할 때 다른 국가를 거쳐 가도(심지어 이미 방문한 국가라도) 된다. 입력 첫 번째 줄에는 테스트 케이스의 수 T(T ≤ 100)가 주어지고, 각 테스트 케이스마다 다음과 같은 정보가 주어진다. 첫 번째 줄에는 국가의 수 N(2 ≤ N ≤ 1 000)과 비행기의 종류 M(1 ≤ M ≤ 10 000) 가 주어진다. 이후 M개의 줄에 a와 b 쌍들이 입력된다. a와 b를 왕복하는 비행기가 있다는 것을 의미한다. (1 ≤ a, b..
출처: 유튜브 나동빈 1. 트리의 개념 루트노드 : A 단말노드 : 자식이 없는 노드로는 G, E, F 크기 : 모든 노드의 갯수이므로 7 깊이 : B:1 C:1 D:2 E:2 F:2 G:3 높이 : 깊이 중 최댓값이므로 3(G) 차수 : 자식이 있는 방향으로의 간선 갯수 A의 차수 : B,C 가 있으므로 2 B의 차수: D,E가 있으므로 2 C의 차수 : F가 있으므로 1 D 의 차수 : G가 있으므로 1 E 의 차수 : 없으므로 0 F 의 차수 : 없으므로 0 G 의 차수 : 없으므로 0 2. 이진탐색트리 2-1 이진탐색트리 설명 *부모노드 기준 왼쪽 자식이 부모보다 작고, 오른쪽 자식이 부모보다 큰 트리 즉 왼쪽 자식 < 부모 < 오른쪽 자식 17 < 30 오른쪽 노드로 이동 찾으려는 37은 부모인..
·오류 해결
컴퓨터를 포맷 후 h2 데이터베이스 설치하는 과정입니다 문제파악 https://www.h2database.com/html/download.html 접속 후 전 Platform-independentZip을 설치해서 압축을 풀어줬습니 압축을 푼 후 bin/h2 를 실행해줍니다 (유형이 window 배치 파일인 것) 그러나 실행 시키면 다음과 같은 모습으로 창이 뜹니다. 무엇이 문제일까요? 위와 같은 문제가 발생하는 두 가지 경우가 있습니다. 1. java가 설치가 되지 않았다. 2 환경변수 설정이 제대로 이뤄지지 않았다. 자바 설치와 환경변수 설정을 해보도록 하겠습니다. 1. java 설치 다음 경로로 들어간 다음에 자바를 설치하고 압축을 풀어줍니다. https://www.java.com/en/downloa..
·오류 해결
김영한님 스프링 강의를 공부하던 중 정상적으로 쿼리가 나가지만 디비에 반영되지 않았다. 이러한 문제를 해결하기 위해 구글링 하던 중 새로운 데이터베이스를 생성하고 실행을 통해 문제 해결이 가능함을 깨달았다. 순서는 크게 다음과 같다 1. DB 생성 2. DB 실행 1. DB 생성 1-1). 저장한 설정 새로운 DB를 생성할 땐 저장한 설정을 Generic H2(Embedded) 로 설정해준다 1-2). JDBC URL jdbc:h2:~/(원하는 파일명) 을 입력한다 그 다음 연결 버튼을 누르면 새로운 db가 생성된다 C:\Users\(사용자 이름) 경로에 위와 같이 새로운 db 파일이 생긴다 2. DB 실행 2-1). 저장한 설정 새로운 DB를 실행할 땐 저장한 설정을 Generic H2(Server) ..
문제 여는 괄호와 닫는 괄호만으로 이루어진 문자열이 주어진다. 여기서 안정적인 문자열을 만들기 위한 최소 연산의 수를 구하려고 한다. 안정적인 문자열의 정의란 다음과 같다. 빈 문자열은 안정적이다. S가 안정적이라면, {S}도 안정적인 문자열이다. S와 T가 안정적이라면, ST(두 문자열의 연결)도 안정적이다. {}, {}{}, {{}{}}는 안정적인 문자열이지만, }{, {{}{, {}{는 안정적인 문자열이 아니다. 문자열에 행할 수 있는 연산은 여는 괄호를 닫는 괄호로 바꾸거나, 닫는 괄호를 여는 괄호로 바꾸는 것 2가지이다. 입력 입력은 여러 개의 데이터 세트로 이루어져 있다. 각 데이터 세트는 한 줄로 이루어져 있다. 줄에는 여는 괄호와 닫는 괄호만으로 이루어진 문자열이 주어진다. 문자열의 길이가..
문제 항승이는 품질이 심각하게 나쁜 수도 파이프 회사의 수리공이다. 항승이는 세준 지하철 공사에서 물이 샌다는 소식을 듣고 수리를 하러 갔다. 파이프에서 물이 새는 곳은 신기하게도 가장 왼쪽에서 정수만큼 떨어진 거리만 물이 샌다. 항승이는 길이가 L인 테이프를 무한개 가지고 있다. 항승이는 테이프를 이용해서 물을 막으려고 한다. 항승이는 항상 물을 막을 때, 적어도 그 위치의 좌우 0.5만큼 간격을 줘야 물이 다시는 안 샌다고 생각한다. 물이 새는 곳의 위치와, 항승이가 가지고 있는 테이프의 길이 L이 주어졌을 때, 항승이가 필요한 테이프의 최소 개수를 구하는 프로그램을 작성하시오. 테이프를 자를 수 없고, 테이프를 겹쳐서 붙이는 것도 가능하다. 입력 첫째 줄에 물이 새는 곳의 개수 N과 테이프의 길이 ..
오랜만에 데이터베이스에 접하게 됐는데 기억이 아니 않아 포스팅을 해보도록 하겠습니다 ERD 란 Entity Relationship Diagram, 즉 엔터티의 관계를 그린 다이어그램 : 1. 식별 VS 비식별 1)식별 관계 (실선) : 부모 테이블의 기본키를 자식 테이블이 가지고 있으며 이를 기본키로 사용하는 경우 특징: 자식 엔터티가 부모 엔터티의 기본 키의 일부로 식별됩니다. 일대일 또는 일대다 관계일 수 있습니다. 예시: 부모 엔터티가 "회원"이고, 자식 엔터티가 "주문"일 때, 주문은 특정 회원을 식별하는 회원 ID를 포함할 수 있습니다. 2)비식별 관계(점선) :부모 테이블의 기본키를 자식테이블이 가지고 있지만 이를 기본키로 사용하지 않을 때 특징: 자식 엔터티는 부모 엔터티의 기본 키에 대한 ..
·cs/운영체제
package hello.core.singleton; import hello.core.Beanfind.ApplicationContextExtendsFindTest; import org.junit.jupiter.api.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import static org.junit.jupiter.api.Assertions.*; class StatefulServiceTest { @Tes..
·JAVA/Spring Boot
Spring data jpa 리포지토리에 구현 클래스 없이 인터페이스 만으로 개 발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 스프링 데이터 JPA가 모두 제공합니다. 순서 인터페이스를 만든다 인터페이스가 인터페이스를 상속한다 SpringDataJpaMemberRepository 가 (JpaRepository, MemberRepository)를 상속 SpringDataJpaMemberRepository가 JpaRepository 를 상속하게 되면 스프링 데이터 jpa 가 (JpaRepository를 import 하는 것을 볼 수 있음 > 이는 스프링에서 제공해 주는 기술로 인터페이스를 구현하여 스프링 빈에 등록하는 기술을 제공 ) 4. SpringDataJpaMemberReposi..