일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- ehcache
- Spring Reactive Programming
- try-catch-finally
- 쿼리 메소드
- StringCacheKeyGenerator
- INSERT ON DUPLICATE KEY UPDATE
- 사이드 프로젝트
- 비식별
- AutoCloseable
- async 와 await
- asciidoctor
- 코드로 배우는 스프링 부트 웹 프로젝트
- spring boot
- JWT
- CHAR 와 VARCHAR
- Apple 로그인
- ExceptionHandlerFilter
- Spring Security
- REDIS
- constant pool
- 비사이드프로젝트
- springboot
- 도메인 주도 설계(DDD) 기반 마이크로서비스(MSA) 모델링
- querydsl
- rest docs
- FeignClients
- @Query
- OpenFeign
- Spring Cloud OpenFeign
- 네이버클라우드 서버
- Today
- Total
목록분류 전체보기 (26)
기록하기
회사에서 프로젝트를 진행하던 중 logback 설정을 수정해야 했는데 이때 적용한 방법을 정리해보고자 한다. 기존 프로젝트를 리팩토링하는 과정에서, 기존과는 다르게 특정 변수에 따라 log 파일의 위치가 다르게 저장이 되어야 하는 요구사항이 추가되었다. 이 요구사항을 적용하기 전과 후의 상태를 간단하게 살펴보기 위해 logback 프로젝트를 생성해보았다. 프로젝트 구조 및 api 상황 Spring Boot Java 8 Spring Data JPA H2 Database 요구사항 적용 전 예시를 통해 설명을 하자면, 만약 DB 에서 어떤 값을 조회해오는 api 하나가 있다고 할 때, 성공/실패의 결과만 구분되어 log 가 쌓이고 있었다고 가정하자 이 경우에는 아래와 같이 설정을 하면 success, erro..
이전 글에 이어서 마지막 flow 를 기록해보려고 한다. 1. Security Configuration 적용 및 flow 설계 2. Spring Security + JWT + Redis 설정 및 진행 과정 3. ExceptionHandlerFilter 설계 ExceptionHandlerFilter 설계 이번 글에서는 설계한 ExceptionHandlerFilter 코드를 공유하고, 어떻게 처리를 했는지 간단하게 설명하도록 하겠다. ExceptionHandlerFilter @Slf4j @Component @RequiredArgsConstructor public class ExceptionHandlerFilter extends OncePerRequestFilter { private final ObjectMa..
이전 글에 이어서 다음 flow 를 기록해보려고 한다. 1. Security Configuration 적용 및 flow 설계 2. Spring Security + JWT + Redis 설정 및 진행 과정 3. ExceptionHandlerFilter 설계 Spring Security + JWT + Redis 설정 및 진행 과정 JwtAuthenticationFilter 에서 토큰의 유효성을 검증하는 역할을 하며 여기서 Exception 이 발생하게 될 경우 ExceptionHandlerFilter 가 이를 처리하도록 설계했다. public class JwtAuthenticationFilter extends OncePerRequestFilter { @Autowired private TokenService ..
Spring Security + JWT 를 적용한 프로젝트에서 토큰을 검증할 때 만료된 토큰이거나 유효성 검증에서 실패할 경우 Exception 처리를 하게 된다. 하지만 Exception 처리 이후 재로그인을 하도록 유도하기 위해 alert 을 줘야하는데 이 과정에서 프론트 개발자에게 해당 메세지를 전달해야하기에 단순히 Exception 처리만 하는 것으로는 해결할수가 없었다. 특히나 Filter 처리 과정에서 발생하는 에러이기에 처리를 위해서는 다른 설계가 필요하다고 판단되어 찾아본 결과 ExceptionHandlerFilter 를 커스텀하여 생성한 뒤 SecurityConfig 에 설정을 해주면 된다고 하여 설정을 해보았다. 1. Security Configuration 적용 및 flow 설계 2...
필자가 실무에서 가장 많이 사용하는 자료구조는 List, Set, Map 인데 이들의 차이점은 무엇일까? 간단하게 정리를 해보고자 한다. 순서가 있는 목록 List List 는 순서가 있는 목록을 나타낸다. List 인터페이스의 가장 큰 차이점은 배열처럼 순서가 있다는 것이다. ArrayList 와 Vector 클래스의 사용법은 거의 동일하고 기능도 거의 비슷한 "확장 가능한 배열"이다. 하지만 ArrayList 는 thread safe 하지 않고, Vector 는 thread safe 하다. ArrayList 는 객체를 선언할 때 매개 변수를 넣지 않으면 초기 크기는 10이다. 따라서 10개 이상의 데이터가 들어가면 크기를 늘이는 작업이 ArrayList 내부에서 자동으로 수행된다. 참고로 자바의 모든..
DB 를 설계할 때 엑셀이나 ER 다이어그램을 이용하여 도메인과 속성을 정의하고, 관계를 정의해보며 설계를 진행한다. 예를 들어 반려동물과 법적 보호자 사이에는 '소유'라는 속성이 있음을 이해한 뒤 관계를 정의해보면 더 정리가 잘 되기 때문에 꼭 ERD 를 그리지 않더라도 속성과 관계를 정의해보는 것을 습관으로 하려고 한다. 하지만 매 번 가장 어려운 것이 식별, 비식별 관계를 정의하는 것과 일대다인지 다대다인지 등을 정의하는 것이 가장 어렵기에 정리를 해보려고 한다. 식별 / 비식별 관계 쉽게 정의하는 식별, 비식별 관계의 정의는 아래와 같다. 키로 찾을 때 여러 개가 나오면 -> 약결합(비식별) 무조건 한 개만 나오면 -> 강결합(식별) 만약, 아래와 같이 테이블이 구성되어 있다고 가정해보자 반려동물..
실무에서 insert 와 update 를 같이 수행시키기 위해 INSERT ON DUPLICATE KEY UPDATE 명령어를 많이 사용하는데, 사용시 PK 를 왜 입력해야하는지에 대해 mariadb 공식 사이트 내용을 정리해보려고 한다. INSERT ON DUPLICATE KEY UPDATE INSERT ON DUPLICATE KEY UPDATE 명령어는 insert 를 할 때, 중복되는 유니크 키 또는 pk 가 있을 경우에는 update 명령어가 수행되고, 그 외에는 insert 가 수행되는 명령어를 의미한다. 예를 들어, Person 클래스가 있고, id 가 pk 일 때 아래와 같이 구성할 수 있다. public class Person { private Long id; private String n..
javascript 에서 DOM 을 조작하는 방법에 대해 알아보려고 한다. DOM 먼저, DOM 이란? 문서 객체 모델(The Document Object Model) 은 HTML, XML 문서의 프로그래밍 interface 이다. DOM 은 nodes 와 objects 로 문서를 표현한다. 이들은 웹 페이지를 스크립트 또는 프로그래밍 언어들에서 사용될 수 있게 연결시켜주는 역할을 담당한다. 자바스크립트에서는 HTML 에서의 값을 가져오거나 수정하는 방법으로 접근을 할 수 있다. 아래에서는 자바스크립트에서 DOM 요소에 접근하는 방법을 설명하려고 한다. id 속성을 이용해서 DOM 요소 찾기 HTML 에서 id 는 유일한 값 이다. 따라서 이 id 로 찾게 되면 값 하나만 리턴하게 된다. document..
프로젝트를 진행하면서 도메인 추출을 통해 테이블 설계 작업을 하고 있는데 어떤 데이터 타입이 이 컬럼에 적절한지 고민이 되는 경우가 많았다. 모든 부분을 기억할 수는 없지만 적어도 가장 많이 사용하는 VARCHAR 타입에 대해 간단하게라도 정리를 할 필요성을 느꼈고, 이 뒤로 조금씩 정리를 해가면서 프로젝트 설계에 도움이 되고자 데이터 타입 정리를 시작했다. CHAR, VARCHAR CHAR VARCHAR 길이 0 ~ 255 byte 0 ~ 65,535 byte 특징 고정 길이 문자열 가변 길이 문자열 할당된 크기만큼공간이 생성된다. 여기서 특징에 주목할 필요가 있다. CHAR 의 경우에는, 고정 길이의 문자열이므로 저장될 데이터의 길이가 지정된 공간보다 작더라도 그 공간이 그대로 유지가 된다. 만약 ..
프로젝트를 수행하던 중 REST docs 설정을 한 뒤 간단한 ControllerTest 코드를 수행해보았으나 build 가 되지 않는 문제점을 발견했다. 오류의 주 내용은, 빈 주입이 잘 되지 않아서 security 설정에서 문제가 발생함을 알게 되었고 Spring Security + JWT 방식으로 인증, 인가 기능을 활용했던 프로젝트에서 인증된 정보를 제공받지 않고서는 단위테스트를 실행할 수 없음을 알게 되었다. 따라서 미리 설계해둔 custom 한 UserDetailsService 클래스(필자의 경우 UserService 라는 이름으로 설계를 했다.) 에서 인증 정보를 먼저 제공받은 뒤 테스트를 실행할 수 있도록 처리가 필요했다. @Service @RequiredArgsConstructor pub..
Promise 는 "비동기 통신을 하는데 서버로 응답이 왔을 때 그걸 호출한 함수에서 알 수 있도록 약속할게" 라는 의미를 가지고 있다. 즉, 비동기 통신을 하게 될 경우 특정 코드 실행이 완료될 때까지 기다리지 않고 다음 코드를 수행하는 것을 의미하는데 이 특성 때문에 처리 결과를 받아와야 하는 경우 데이터를 받아오지 못하는 문제가 발생하게 된다. 이를 위해 나온 개념이 Promise 이다. 기존 XMLHttpRequest 객체를 사용하여 통신을 하는 코드를 살펴보도록 하겠다. function getData() { const xhr = new XMLHttpRequest(); xhr.open("GET", "http://localhost:3000/posts"); xhr.setRequestHeader("co..
String.prototype 에는 padStart(), padEnd() 함수가 있다. 이 두 함수의 특징은 전달 받은 길이만큼 원하는 문자를 채우는 함수인데, 자바스크립트의 String 오브젝트를 배우면서 가장 기억에 남는 함수라서 먼저 정리를 해보려고 한다. padStart() 첫 번째 파라미터 길이 두 번째 파라미터 채울 문자 첫 번째 파라미터로 전달 받은 길이 만큼 문자열의 앞에 두 번째 파라미터로 채우는 함수이다. let num = "7"; console.log(num.padStart(4, "0")); //0007 이 함수의 경우, 4월을 04월로 표시를 해야하는 경우에도 사용할 수 있다. 예를 들어, 다음과 같이 작성할 수 있는 코드를 padStart() 함수를 사용하면 좀 더 편리하게 원하는..