전체 글 123

List 사용 - 동시성 문제 (Synchronized vs Concurrent)

List 사용시 갑자기 생겨나는 null 발생한 상황과 문제 스프링 스케쥴러를 통하여 하루 한 번 db에서 사라진 이미지 파일 url 값을 감지해 s3 버킷에서 삭제하는 기능을 만들고 있던 도중 생겨난 문제이다. S3에서 모든 파일 object 리스트를 받아와서 db에 현재 존재하는 file 이름 값과 대조하여 s3에 남은 고아 object들을 stream.forEach를 통해 진행하던 도중 처음 이미지가 많이 없을 때는 문제가 없었으나 이미지가 많아지고 나니 null값이 뜨며 NullPointerException이 터졌음. 발생 환경 SpringBoot version - 2.7.2 Java Complier version - 11 h2 db IDE - Intelli J 해결 및 시도 방법 1. S3에서 ..

Troubleshooting 2022.08.09

JWT - expired date issue

JWT - expired date issue 발생한 문제 다른 조원들 컴퓨터에서는 잘되는 JWT 토큰 필터가 내 컴퓨터 환경에서는 작동하지 않는다. 심지어 본인의 다른 노트북으로 clone 하여 시도했을 때는 잘되는 점으로 보아 무엇인가 문제가 있다. 저번주부터 이런 비슷한 현상이 일어났는데 저번주에는 부족한 실력 탓이라 생각했으나 같은 코드를 내 컴퓨터에서만 안되니 코드 어딘가가 문제라는 것을 어렴풋이 알게 되었다. 해결 및 시도 방법 1. 처음에는 deprecated 된 Apdapter를 사용해서 생겨나는 문제인 줄 알고 관련 키워드를 모두 검색해봤으나 비슷한 증상이 없었다. 2. 본인의 컴퓨터에서만 안되는 것으로 보아 시스템의 문제가 있다고 판단하여 포멧까지 진행하였다. 그래도 실패. 똑같은 증상이..

Troubleshooting 2022.08.09

AWS EC2 Redis 세팅 해보기

EC2 Redis 설치! Redis를 통하여 JWT Refresh Token 저장하고 사용해보기 위하여 EC2에 Redis를 세팅해보려고 한다. 하다보니 설치부터 난항이라 정리 겸 글을 작성해본다. apt 업데이트 설치를 위해 ec2 apt 패키지 인스톨러를 업데이트한다 sudo apt-get update sudo apt-get upgrade Redis 설치 자동 설치! sudo apt-get install redis-server Redis 버전 확인 redis-server —-version Redis 에서 사용할 메모리 설정! EC2 stat 보기 다음 코드를 치면 그림처럼 EC2 서버의 메모리와 다른 정보들이 보인다. 내 EC2 프리티어 서버는 1GB 메모리를 가진다. vmstat -s 메모리 설정하..

Web Dev 2022.08.04

TroubleShooting: H2 Database + Spring Security CSP Issue

H2 Database + Spring Security CSP Issue 발생한 문제 기존 h2 콘솔은 webSecurityConfig 파일에서 접속을 허용하여 잘 나옴. 그런데 접속을 하면 다음과 같이 로컬 호스트에서 연결을 거부했다고 뜨며 div 태그가 먹통됨. 해결 및 시도 방법 구글링 - h2 Security 설정과 관련된 키워드로 구글링 최초 결과는 단순히 console을 보여줄 것 인지에 대한 트러블 슈팅 정리 글이 있었음 spring.h2.console.enable=true로 변경하라는 대처 방법 본인은 그 전에도 잘 사용하고 있었기 때문에 이 문제가 아님. 판단하기에 webSecurity 객체를 통해서 인증, 인가 처리를 모두 제외(아래 코드 참조)시키면 잘 작동되는 것으로 보아 다른 옵션에..

Troubleshooting 2022.08.03

Spring Security - Filter의 동작 원리

Spring Security 동작 원리 이해하기 이 글은 다른 글들을 짜집기하여 본인의 Spring Security 이해를 돕기 위해 작성하는 글입니다. Security를 커스터마이징하여 사용하기 앞서 동작 원리를 이해하고 프로젝트에 적용하기 위해 정리를 합니다. Spring Security는 웹 서비스에서 MVC 패턴 이전에 작동하는 `필터`로서 동작합니다. 필터란 클라이언트 요청이 서블릿으로 가기 전에 먼저 처리할 수 있도록 톰캣(WAS)에서 지원해주는 기능입니다. 그래서 설정도 톰캣의 설정파일인 `web.xml`에 하지만, 스프링 부트를 사용하는 환경이고, 최신 스프링 부트(2.7 버전 이상)에서는 컴포넌트 기반의 설정을 지향하므로 컴포넌트 기반의 설정법을 다루어볼 예정입니다. 이 글의 중심은 Sp..

Web Dev/Spring 2022.08.02

Spring: 로그인 - UserDetailsServiceImpl loadUserByUsername 문제

발생한 문제 Spring Security 를 이용해 로그인을 만들던 도중 문제가 생겼다. AuthenticationManager 가 username과 password를 받아 처리해야하게끔 하려고 했다. 그래서 WebSecurityConfig에 다음과 같이 처리하였다. @Bean // Security 추가 설정하도록 빈 생성 public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { // API (POST /api/**) 에 대해 CSRF 무시 http.csrf() .ignoringAntMatchers("/**"); http .authorizeHttpRequests((authz) -> authz .antMatchers("/ima..

Troubleshooting 2022.08.01

JdbcSQLSyntaxErrorException: Syntax error - `USER` 예약어 문제

발생한 문제 기존 과제 프로젝트에서 `Post` Entity에 이어 `User` Entity를 추가하고 Spring 테스트를 진행해보니 `JdbcSQLSyntaxErrorException`과 `Error executing DDL "drop table if exists user CASCADE " via JDBC Statement` 로그 에러가 뜸. 2022-07-30 13:48:03.664 WARN 46028 --- [ main] o.h.t.s.i.ExceptionHandlerLoggedImpl : GenerationTarget encountered exception accepting command : Error executing DDL "drop table if exists user CASCADE " v..

Troubleshooting 2022.07.30

IoC, DI, 컨테이너 그리고 Bean

IoC, DI 그리고 컨테이너 모든 객체는 클라이언트 객체와 서버 객체로 나뉜다. 이 때, 호출하는 객체가 호출 당하는 객체에게 의존적이며 의존 관계에 있다고 표현한다. IoC 제어의 역전 (Inversion of Control) 기존 프로그램은 클라이언트 구현 객체가 스스로 필요한 서버 구현 객체를 생성하고, 연결하고, 실행했다. 한마디로 구현 객체가 프로그램의 제어 흐름을 직접 조종했다. 개발자 입장에서는 당연한 흐름이다. 반면에 AppConfig(스프링의 역할을 대신 해주는 커스텀 클래스)가 생긴 이후에는 구역 영역과 사용 영역으로 나뉘어 AppConfig는 사용해야하는 객체를 구현하고 역할을 표현하는 일만하고 사용 영역은 비즈니스 로직을 담당하게 되었다. 이렇게 객체가 스스로 사용해야하는 객체를 ..

Web Dev/Spring 2022.07.29

Springfox-Swagger2 사용해보기

Swagger Swagger란 REST APU의 문서화를 위해 사용하는 것. 단순히 postman처럼 테스팅하는 용도로 사용되는 줄 알았으나 라이브러리로서 개발자가 REST API 문서 작성을 쉽고 간단하게 자동화하도록 도와준다. 간단한 설정만으로도 API 목록을 웹에서 확인 가능하고 테스트까지 가능하게 해주는 라이브러리다. 작은 과제 프로젝트를 위해 직접 작성했었는데 이번에는 Swagger를 공부하고 도입하여 과제 프로젝트 REST API 문서를 작성해보려고 한다. REST API 문서화는 왜 필요한가? 프로젝트의 개발과 유지보수 과정에서 API의 규격을 정의한 문서는 반드시 필요하다. 만약 API 문서가 없다면 API를 확인할 때 시간 낭비가 생기고 소통의 문제가 생길 것이며 테스트를 진행할 때도 코..

Web Dev 2022.07.29

JAVA - Enum 파헤치기

Enum이 궁금한 이유. -> 과제 프로젝트를 하면서 각 기능들에 대한 테스트를 진행 중이었다. 그러던 중 postman의 너저분한 trace 보고는 `와.. 이건 아니지..`라는 생각이 들었고, exceptionHandling을 하고 싶어 졌다. Exception 발생에 대한 핸들링을 하기 위해서 나만의 에러코드와 메세지 그리고 어떻게 리턴해줄 것인가에 대한 생각을 해봐야겠다고 생각을 했고, 에러 코드와 같이 정해져있어야 하는 상수같은 값을 Enum 열거형으로 만들어야 겠다?(사용하시는걸 보고 따라해봐야겠다)라고 생각했다. 자바 공부할 때 간단하게 보고 넘어갔지만 더 좋은 활용을 위해서는 공부를 왜 쓰는지에 대해 하는 것이 좋겠다고 판단하여 포스팅을 해본다. Enum Enum은 Enumerated Ty..

Language/Java 2022.07.26