목록전체 글 (717)
쌓고 쌓다
principalName cannot be empty 에러가 발생했다. 보통 UserDetails의 구현체를 만들때getUsername에 null을 반환하면 발생하는 에러라고한다. principalName에 텍스트가 없으면 발생하는 에러이다. 하지만 다음과 같이 모두 반환값을 만들어 놨다.public class CustomUserDetails implements UserDetails, OAuth2User { @Override public String getUsername() { return this.loginId; } @Override public String getName() { return nickname; } } 이 에러는 Us..
문제 상황기존에 카카오 로그인을 RestTemplate를 이용해 REST API로 구현을 했었는데Spring Security의 OAuth2를 이용해 손쉽게 카카오 로그인 API 결과를 얻을 수 있다. 그런데 이상하게 AccessToken을 얻은 다음 이뤄지는 loadUser 메소드가 동작하지 않는것이다. SecurityConfig.classhttp.oauth2Login((auth2) -> auth2 .userInfoEndpoint(userInfo -> userInfo .userService(customOAuthService)));사용자 정보를 가져온 후 처리하는 customOAuthService를 설정해주었는데 package com.example.bucketlist.config.secu..
웹 사이트를 만들며 PC와 모바일 환경에서 달리 화면을 보이게하길 원했다. 부트스트랩을 이용해서 반응형 웹을 만들고 있는데 이상한 부분이 있는 것이다. 보여질 컨텐츠가 1 2 3 4 순서라고 하자.화면이 작아졌다면 컨텐츠를 행을 늘려1 23 4이렇게 컨텐츠를 보여지거나1234이렇게 컨텐츠를 보여주는 것이다. 이상하게 다음과 같은 현상이 발생했다.PC에서는 웹 창 크기를 모서리를 드래그하여 조절할 수 있다.화면을 줄여서 컨텐츠의 순서가 1 2 3 4 순에서1 23 4 과 같이 잘 반응하여 변경되는데 모바일에서 접속해보면 화면이 다음과 같이 보이는 것이다.화면은 작아졌지만 PC에서 보는 화면 그대로 크기가 유지되어 있다. 알고보니 PC와 모바일의 뷰포트가 동일했던 것이였다.뷰포트? 우리가 볼 수 있는 시야의..
기존 수동 배포 과정이전의 프로젝트 아키텍처를 보자. 빌드와 배포 모두 수동으로 진행했었다.테스트 코드도 돌려보고 빌드하고 이미지로 만들어서 EC2에서 구동시키는 방법이였다. 이제 이 과정들을 자동화해보고자 한다. 목표Github Push -> 테스트 코드 실행 -> Docker 이미지 build, push -> EC2에서 pull -> 이미지 동작 구축깃허브 리포지토리에 Actions 탭이 있다. 현재 프로젝트는 Gradle로 빌드한다. Configure를 누르자. .github/workflows 경로에 Actions를 위한 스크립트를 작성해야한다. 필자는 다음과 같이 구축했다.name: CI/CDon: push: branches: [ "main" ] pull_request: branc..
다음의 html을 작성했다. 회원가입 그냥 회원가입 버튼을 누르면 "/members/signup"으로 POST 요청을 보내는 html이다. 회원 가입 버튼을 눌러 POST 요청을 보냈더니 403 에러가 발생했다.. Security의 설정 빈을 다음과 같이 작성을 해서 분면 모든 요청을 허락했는데 말이다..@Configuration@EnableWebSecuritypublic class SecurityConfig { @Bean SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(request -> request .anyRequest..
테스트 코드 작성중에 특정 인자와 함께 메서드가 1회 실행되었는지 확인하는 과정이 있었다.그런데 이상하게 인자가 잘 넘어갔는데 메서드가 테스트가 통과하지 않는 것이다. 동일한 객체인지 비교에 문제가 있어서 그런가 클래스에 @EqualsAndHashCode를 붙였더니테스트 코드가 통과된다. 그래서 equals와 hashCode에 대해 이해해보자. Object 클래스에 기본적으로 hashCode과 equals가 있다. 이건 어디다 쓰이는 것일까? @Testvoid test() { Car carA = new Car("12가3456"); Car carB = new Car("12가3456"); System.out.println("carA == carB : " + (carA == carB)); ..
API 서버를 만들어보면서 회원 인증 방법에 대해 JWT를 택했다. JWT는 AccessToken과 RefreshToken으로 회원을 구분한다. 처음에는 Refresh Token의 필요성에대해 전혀 이해가 가지 않았다.그냥 Access Token을 Refresh Token 처럼 만료 기한을 길게 잡고 쓰면 되는것이 아닌가?DB에서 Access Token을 저장하며 사용하면 탈취시 대응할 수 있지 않는가? 전혀 JWT의 장점을 이해하지 못한 상태에서 생각할 수 있는 수준 정도였던 것 같다. 클라이언트가 서버에 인증 과정을 거쳐 JWT인 Access Token과 Refresh Token을 발급 받는다. 먼저 Access Token에 대해 알아보자.Access TokenAccess Token은 만료 시간을 짧..
https://school.programmers.co.kr/learn/courses/30/lessons/132266#qna 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 풀이 방법최단 거리를 구하는 BFS 문제이다.부대에서 BFS 탐색을 시작하면 된다. 전체 코드import java.util.*;class Solution { class Node { int num; Node(int num) { this.num = num; } } public int[] solu..