- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- SpringBoot
- Kotlin
- 만들면서 배우는 클린 아키텍처
- JPA
- Spring Security
- EntityTransaction
- SPRING JWT
- 캐싱전략
- spring
- 리뷰
- 후기
- infra
- chrome80
- 팀네이버 공채
- JWT
- 책
- 브랜치전략
- 스프링
- websocket
- 젠킨스
- redis
- docker
- Project
- jenkins
- 프로젝트
- network
- LazyInitialization
- 팀네이버
- Java
- container
목록spring (11)
PPAK
multipart/form-data multipart/form-data 는 http 를 사용해 데이터를 주고 받는 상황에서 하나의 body 에 여러 데이터를 넣어야 하는 경우를 구현하기 위해 만들어진 Content-Type 이다. (e.g 사진을 전송하는데 이에 대한 설명을 함께 포함해서 전송하고 싶은 경우에 사진은 image/jpeg 타입이지만, 설명은 text/plain 으로 전송해야 하는 경우, 웹브라우저 관점에서는 폼 데이터를 전송할 때 사용하는 Content-Type 이다) 위 사진은 HTTP Request 의 구조이다 multipart/form-data type의 데이터를 전송하겠다는 것의 의미는 ContentType 헤더 값으로 multipart/form-data 를 사용하는 것이고 body..
Spring Rest Docs 는 API 인터페이스를 손쉽게 만들기 위해서 사용하는데, Spring MVC Test 혹은 WebTestClient를 통해 생성된 파일(adoc 파일, snippets)을 조합하는 방식으로 수행한다. 비슷한 목적으로 Swagger를 사용하곤 한다. Swagger의 경우 프로덕션 코드에 Swagger 코드가 섞여 들어가는게 다소 부담됐고 변화하는 API 스펙에 맞춰 Swagger 코드 또한 수정해야 했었는데, Rest Docs는 테스트 코드를 바탕으로 문서가 생성되기 때문에 이러한 문제가 해결 된다. 즉, 테스트를 통과한 코드에 대해서 문서를 생성하기 때문에 잘못된 문서를 제공할 일이 줄어든다. 물론, Swagger를 사용하면 웹에서 API 호출 테스트를 손쉽게 수행할 수 있..
제가 서버에 채택한 인증 방식은 JWT 를 활용한 Access Token 교환 방식입니다. 서버 측에서는 사용자가 정상적으로 로그인을 마치면 사용자 인증 정보를 포함하는 Access Token 과 이를 재발급할 수 있는 Refresh Token 을 생성하여 발급합니다. 이후에 클라이언트는 발급된 Access Token 을 서버에 제출하기만 하면 정상적인 사용자의 요청으로 간주될 수 있습니다. 해당 인증 방식을 구현하는 과정에서 여러가지 보안적인 측면을 고려하지 않을 수 없는데 가장 대표적으로 XSS, CSRF 공격에 대한 방어가 핵심이 될 수 있습니다. 본 포스팅 에서는 어떤 방식으로 토큰을 발행하고, 어디에 저장을 하는 것이 옳은가에 대한 고민과 결과를 적어보겠습니다. 이전 글에서는 CORS 허용 정책..
이전 게시글 에서 로컬 환경에서 SSL 인증서를 발급하고 https 를 적용해 보았습니다. 하지만 로컬에서 발급한 인증서는 공식적인 CA(Certificate Authority) 기관에 등록되어있지 않기 때문에 원격 서버에서 사용 시 브라우저에서 경고메세지와 함께 접근을 차단합니다. 따라서 CA 기관에 인증서 발급 요청을 하고 등록을 하는 과정이 필요합니다. 보통의 CA 기관은 일정 가격을 지불하고 복잡한 절차를 거쳐 인증서를 발급하지만 개인적인 토이 프로젝트를 진행하면서 비용을 지불하기란 쉽지 않습니다. 여기서 Let's Encrypt 라는 비영리 CA 기관은 https 의 확산에 기여하기 위해 무료로 SSL 인증서를 발급해주고 있습니다. 이번 프로젝트 에서는 Let's Encrypt SSL 인증서 발..
자바는 기본적으로 KeyStore 와 KeyStoreSpi 클래스를 활용하여 인증서를 관리하는 방식을 제공합니다. 해당 클래스에서 사용되는 파일을 생성하는 keytool 커맨드는 jdk 에서 기본적으로 제공합니다. (OpenSSL 과 비슷) 본 포스팅에서는 keytool 을 활용하여 인증서를 생성하고 https 통신을 적용해보려고 합니다. keytool -genkey -alias AN-keystore -storetype PKCS12 \ -keyalg RSA -keysize 2048 -keystore AN-keystore.p12 -validity 3650 -genkey: keytool 의 키 생성 -alias: keystore 별칭 -storetype: PKCS12, JKS 중 택 1 (자바에서는 Key ..
기존에 스프링 시큐리티에 대해서 잠깐 공부하고 간단하게 실습해본 것이 전부인 상태에서 이번에 진행하는 프로젝트에 한번 적용을 해보려고 합니다. 기본적으로 스프링 시큐리티는 애플리케이션에서 인증/인가 에 대한 설정을 편리하게 도와주는 역할을 합니다. Controller 에서 인증 인가를 충분히 수행할 수 있지만 관심사의 분리 측면에서 역할이 확실히 구분됩니다. 1. Controller 는 사용자의 요청에 대한 서비스의 응답을 구성한다. 2. 인증과 인가는 Controller 까지 요청이 오지 않고도 충분히 수행할 수 있다. 따라서 Dispatcher Servelet 에 요청이 돌아오기 전에 인증과 인가를 수행하는 레이어를 스프링 시큐리티가 담당한다고 볼 수 있습니다. 위 사진은 전체적인 스프링 시큐리티의 ..
SQL 에서 서로 다른 테이블을 연관지어 불러오기 위해 사용되는 inner join 과 outer join 외에 JPA 의 JPQL 에서는 fetch join 을 제공합니다. 이전 포스팅 에서 확인했듯 JPA 는 영속화를 바탕으로 데이터베이스 테이블과 직접적으로 연결되는 엔티티 객체를 추적하고, 관리하는 방식을 채택하여 불필요한 쿼리 생성을 최소화 합니다. 대표적으로 Transaction 내의 쓰기 지연 방식과 지연 로딩을 예로 들 수 있는데 오늘은 지연 로딩 사용시 발생할 수 있는 N+1 문제와 이를 해결할 수 있는 방법인 Fetch Join(join fetch) 에 대해서 알아보려고 합니다. 지연 로딩(Lazy Loading) 은 실제 연관관계에 있는 엔티티들 중 하나를 조회하려고 했을 때, 데이터..
Spring MVC 패턴에서 핸들러 어댑터에 의해 호출되는 Controller 는 클라이언트의 요청에 따른 서버 로직을 수행해야 한다. 대표적으로 수행해야하는 로직으로는 아래 3가지가 존재한다. 1. 요청 값의 유효성 판별 2. 비즈니스(서비스) 로직 수행 3. 결괏값 보존(영속화) 위와 같이 명확하게 역할이 분리된 상황에서 Controller 가 모든 역할을 부담하는 것은 유지 보수 측면에서나, 역할과 책임 그리고 관심사의 분리를 중요시하는 객체지향적 관점에서나 적절하지 않는 전략일 것이다. 따라서 Spring Boot 에서는 Controller(Presentation) - Service(Business) - Repository(Data Access 혹은 Persistence) 의 3 가지 레이어를 두..
이전 포스팅 에서 JPA 가 자바 진영의 ORM 기술 표준이라는 것과, 성능 최적화를 위해 내부적으로 영속성 컨텍스트(Persistence Context) 를 사용한다는 것을 알아보았다. [Spring/JPA] JPA 란? (ORM/Persistence Context) 보편적으로 서비스가 구동되는 과정에서 데이터의 최종 저장소는 데이터베이스이다. 그 중에서도 관계형 데이터베이스는 우리가 보편적으로 사용하는 데이터베이스 모델이며 키(pk)를 통해 값 ppaksang.tistory.com 이번 포스팅에서는 JPA 를 실제로 사용하기 위한 환경설정과 어떤 흐름으로 DB 와의 연결을 가져오고, Query 를 전송하는지 알아보도록 하겠다. 개발환경 셋팅 Build 도구로는 Maven 을 선택하였다. Java : ..
보편적으로 서비스가 구동되는 과정에서 데이터의 최종 저장소는 데이터베이스이다. 그 중에서도 관계형 데이터베이스는 우리가 보편적으로 사용하는 데이터베이스 모델이며 키(pk)를 통해 값을 조회하는 방식을 가진다. 자바 진영에서는 JDBC API 를 통해서 데이터베이스와의 직접적인 연결관계를 구축한다. JDBC 예제 코드를 살펴보면 connection 을 생성하고, SQL 문을 전송하여 데이터를 송수신 하고, connection 을 닫는 형태를 가지는데, 개발자가 매번 데이터베이스에 접근하려 할 때마다 위와 같은 중복된 로직을 작성하는 것은 굉장히 비효율적일 것이다. 이와 같은 반복되는 로직을 줄이고자 SQL Mapper, ORM 등과 같은 기술이 탄생하였는데, 오늘은 ORM 의 개념을 담고있는 JPA 에 ..