로그인 처리는 Filter와 Interceptor중 무엇을 선택해야 할까?
2022. 4. 11. 19:27
Spring
Filter와 Interceptor(로그인 처리, 스프링) 서론 토이 프로젝트로 로그인을 인터셉터로 구현하던 중이었다. 그런데 팀원 중 한 분이 시큐리티는 필터를 사용하는데 무엇을 써야할지에 대한 의문을 내셨다. 나는 인터셉터가 제공하는 기능들이 편리하기 때문에 사용했는데 조금 더 알아보기로 했다. 차이점 Filter와 Interceptor는 실행 시점이 다르다. Filter는 스프링 밖에 Web Application에 존재하고, Interceptor는 스프링에 존재한다. Filter는 스프링에 오기 전에 처리할 수 있기 때문에 스프링까지 들어오는 필요를 줄여준다. Interceptor는 스프링이 기능을 제공하기 때문에 편리하다. 대략 이런 내용들이 많다. @ExceptionHandler 솔직히 경험이 ..
Interceptor 예외를 @ExceptionHandler가 핸들링 가능할까?
2022. 4. 11. 18:42
Spring
Interceptor에서 예외를 응답 해주는 방법 postman 요청은 성공? 다른 서버에서는 실패? // /error 는 스프링 부트가 제공하고 있기 때문에 커스텀 해도 스프링을 타게 되기 때문에(BasicErrorController.java) // /api/error 와 같이 커스텀 해야한다. request.setAttribute("message", "로그인이 필요한 서비스"); request.getRequestDispatcher("/error").forward(request, response); 문제 HandlerInterceptor에서 예외를 RestControllerAdvice가 핸들링하지 못한다. 상황이 어떤가 살펴보자. 소셜 로그인을 시도한다. authorization code가 유효하지 않..
Spring Rest Docs를 사용하는 이유와 사용하지 않을 이유
2022. 3. 26. 20:15
Spring
Spring Rest Docs VS Swagger 서론 팀원들과 Rest Docs와 Swagger 중 무엇을 고민할지 상의했다. 결과적으로는 나의 생각과는 다르게 Rest Docs를 선택했다. Swagger도 튜토리얼 정도만 해봤기 때문에 둘의 장단점을 명확하게 공감하지는 못한다. 그래서 이번에는 팀원들의 의견을 따라 Rest Docs를 사용하며, 장단점을 느껴보자. Spring Rest Docs VS Swagger Spring Rest Docs Swagger 장점 프로덕션 코드에 영향이 없다. 문서상에 API를 테스트할 수 있는 기능이있다. 테스트 코드가 성공해야 문서 작성이 가능하다. 테스트 코드가 필요없으므로 적용이 쉽다. 단점 테스트 코드를 작성해야 하므로 적용이 불편하다. 프로덕션 코드에 테스트..
테스트 코드 작성 시 데이터베이스 초기화 하는 방법
2022. 3. 26. 19:40
JPA
테스트 코드 작성 시 데이터베이스 초기화 하는 방법 이전까지 테스트 코드 작성 시 데이터베이스 초기화 방법 데이터베이스를 초기화 해야하는 이유는 각각의 테스트는 독립된 환경에서 검증이 되어야 하기 때문이다. 테스트 코드를 작성하면 각 테스트마다 초기화된 데이터 베이스로 테스트 하기 위해 데이터 베이스를 초기화 해주어야 한다. 그 때 나는 보통 repository.deleteAll()을 사용했었다. 이전에는 몰랐는데 이번 프로젝트를 하면서 고민을 하게되며, 단점과 다른 방법을 알게 되었다. 이전 방법의 단점 repository.deleteAll()의 단점은 테스트 코드가 프로덕션 코드에 의존하게 되는 것이다. 프로덕션 코드에 의존하게 되면, repository가 변경될 경우 테스트 코드에 의존 역시 변경되..
JPA 기본키 전략을 뭘 사용해야 할까?
2022. 3. 26. 13:18
JPA
기본키 전략은 뭘 사용해야 할까?(블로깅) Identity 전략 vs Sequence 전략 Identity 전략 auto-increment를 사용하기 때문에 데이터베이스에 insert 쿼리가 실행이 되어야 ID값을 알 수 있다. 그래서 JPA에서는 persist()시점에 즉시 insert 쿼리를 실행하고 데이터베이스에서 식별자를 조회하게 된다. 즉, 쓰기 지연의 이점을 누릴 수 없다. Sequence 전략 시퀀스 전략은insert 쿼리와 상관없이 데이터베이스에서 시퀀스를 만들어서 그 시퀀스를 호출해서 사용하기 때문에 insert 쿼리가 나가지 않아도 ID를 생성할 수 있다. 이게 가능한 이유는 JPA가 데이버베이스에 있는 시퀀스를 내부적으로 조회하는 기능이 있기에 가능하다. 즉, 쓰기 지연의 이점을 누릴..
JPA에서 영속화라는 의미는 뭘까?
2022. 3. 25. 12:23
JPA
JPA에서 영속화라는 의미는 뭘까? 팀 사이드 프로젝트를 하던 중 JPA(ORM)을 사용하는 이유에 대해 이야기를 하다가 한 분이 persist, 영속화라는 의미에 대해 고민을 하시고, 이야기를 하게 되었다. JPA는 왜 Java Persistence Api라는 이름을 지었을까? Persistence 사전적 의미는 지속되다라는 의미가 있다. 엔티티 매니저의 persist() 메서드가 있다. save라고 해도될텐데 말이다. 이유는 정의하기 나름일 수도 있지만, 나는 간단하게 flush, commit 단계가 존재하고, 영속성 컨텍스트에 영속화 하는 것이기 때문에 persist()라고 네이밍 했을 것이라고 했다. save는 persist, flush, commit을 모두 포함하는 것이기 때문이다. 팀원 분의 ..
ORM(JPA)를 왜 사용할까?
2022. 3. 24. 00:02
JPA
ORM을 왜 사용하는가? SQL 의존적 개발 객체지향은 객체를 기반으로 개발을 해야하는데 관계형 데이터베이스를 사용하기 때문에 반복적인 SQL 작업을 해야한다. 패러다임의 불일치를 해결하자. 상속 객체는 상속관계가 있지만 데이터베이스는 없다. 출처 : 스프링 핵심 원리 - 기본편 하지만 위의 그림처럼 데이터베이스도 슈퍼타입 서브타입의 관계로 상속과 비슷한 구조로 설계할 수는 있다. 그렇다면 이제 어떤 부분이 불일치가 될까? 각각의 테이블에 따른 조인 SQL을 작성하고 각각의 객체에 매핑을 해줘야 한다. Album을 조회한다고 가정 해보자. 각각의 테이블에 따른 조인 SQL 작성 매핑할 각각의 객체 생성 이런 과정을 반복하게 된다. 이게 왜 문제가 될까? 만약 데이터베이스를 사용하지 않고 자바 컬렉션에 저..
SSH란?
2022. 3. 22. 14:31
기타 IT
SSH란 Secure Shell의 약자로 원격지에 있는 컴퓨터를 안전하게 제어하기 위한 프로토콜이나 이 프로토콜을 사용하는 프로그램들을 의미한다. Secure는 단어 그대로 보안이라는 의미이고, Shell은 컴퓨터를 명령어로 원격지에서 제어하는 방식이다. SSH가 적용된 서버를 SSH가 적용된 클라이언트가 제어하게 된다. 상호작용을 하는 방법은 암호화를 사용하게 된다. 기존에는 Telnet을 주로 사용했는데 평문으로 정보를 전송하기 때문에 중간에서 가로챌 경우 보안상 문제가 생기므로, Secure를 도입해서 SSH를 사용하게 되었다. 그 보안이 바로 암호화와 복호화 방식인 것이다. 암호화 방식 암호화 방식에는 여러가지가 있지만 핵심은 공개키와 개인키 쌍이 필요하다는 것이다. 간단하게 예를 들자면, 젠킨스..