CustomOidcUserService 구현
·
Backend/Spring Boot& JPA
클라이언트로 부터 받은 code를 바탕으로 유저 정보를 가져왔다. 이후 유저 정보를 멤버 엔티티로 전환하기 위해 CustomOidcUserService를 구현했다.OidcUserService를 상속받는 것과 위임받는 것에는 무슨 차이가 있을까..방법1) 상속 방식 extends OidcUserServicepublic class CustomOidcUserService extends OidcUserService { @Override public OidcUser loadUser(OidcUserRequest request) { OidcUser user = super.loadUser(request); // 사용자 커스터마이징 return user; }}방법2)..
CSRF 토큰(feat, Synchronizer Token Pattern)
·
Computer Science/WEB
CSRF는 사용자가 의도하지 않은 요청을 유도하는 공격이다.CSRF를 막는 방법 중 하나인 STP(Synchronizer Token Pattern)에 대해 공부할거다.방법(서버렌더링 ver)서버는 세션에 CSRF 토큰을 생성해 저장한다html 폼을 렌더링할 때 hidden input이나 meta 태그로 클라이언트에 토큰을 내려준다.사용자가 폼을 전송할 때 CSRF 토큰을 함께 보낸다end. 서버 검증(세션 저장 값과 같은지)SPA라면?Double-Submit Cookie 패턴 사용서버가 읽을 수 있는 쿠키(ex.XSRF-TOKEN)을 내려주고, 클라이언트가 같은 값을 헤더에 담아 보낸다서버는 쿠키값과 헤더값이 같은지 비교Spring security에서 어떻게 적용되고 있는지SecurityFilterCha..
Spring Data JPA에서 findById()는 안티 패턴일까? – getReferenceById()와의 차이점 정리
·
Backend/Spring Boot& JPA
Spring Data Jpa에서 입력으로 들어온 외래키가 유효한지 확인하기 위해 findById()를 자주 사용한다.이런 방식이 안티 패턴이고 getReferenceById()를 사용하라는 글을 우연히 발견했다.두 메서드의 차이점은 뭘까.먼저 findById()는 Eager Loading을 한다. 즉 메서드를 호출하는 즉시 Persistence Context에 해당 엔티티를 저장한다.반면 getReferenceById() Lazy Loading을 한다. 호출된 시점에는 Persistence Context에 빈 Proxy 객체를 가지고 있다가 실제 isnert 되는 시점에 쿼리가 나간다.(Select 없이 isnert 쿼리만 나간다.)Persistence Context에 실제 객체를 저장하지 않기 때문에 ..
프레임워크를 사용하는 이유
·
Backend/Spring Boot& JPA
자바만으로 어플리케이션을 만들 수 있는데 우리는 왜 프레임워크를 사용하는지가 문득 궁금해졌다. 자바는 어플리케이션 개발을 위한 많은 오픈소스들과 라이브러리가 있고, 활발하게 업데이트가 되고있다. 때문에 프레임워크는 어플리케이션을 완성하기 위해 필수품은 아니다. 그러나 아래와 같은 이유로 프레임워크를 사용하는 것을 권장한다. 보일러 플레이트가 아닌 핵심업무에 집중할 수 있다. 다년간의 정보들이 디자인 패턴의 형태로 모아져 있다. 업계 및 규제 표준을 준수할 수 있다. 어플리케이션의 총비용을 줄일 수 있다. 아래와 같은 문제점도 존재한다. 특정 방식으로 어플리케이션을 만들도록 강요한다. 특정 버전의 언어와 라이브러리에 묶인다. 어플리케이션이 차지하는 리소를 늘린다. 보일러 플레이트(boilerplate) :..
@Transactional의 작동 방식과 롤백되지 않는 문제(Checked Exception)
·
Backend/Spring Boot& JPA
HTML 삽입 미리보기할 수 없는 소스 ‘스프링 부트 쇼핑몰 프로젝트 with jpa’ 책의 코드를 따라가던 중 상품 등록 과정에서 문제가 생겼다. 상품의 이미지 등록이 실패하면 상품 정보는 DB에 저장되고 이미지는 저장되지 않았다. 이미지가 저장되지 않았던 원인은 파일을 저장할 폴더가 없기 때문이었다. 하지만 @Transactional 이 제대로 작동한다면 상품정보와 상품이미지 모두 데이터베이스에 들어가지 않았어야 한다고 생각했고, 원인을 찾기 위해 @Transactional의 동작방식과 원인에 대해 알아봤다. 원인 @Transactional 에서 Checked Exception은 롤백하지 않는. 이미지 파일을 저장할 때 FileNotFoundException 이 발생했고, 이는 Checked Exce..
.gitignore 없이 변경사항 추적하지 않기
·
Computer Science/git
로컬에서만 git에 추적되지 않았으면 하는 파일이 있을 때 사용 1. 프로젝트 최상단에서 exclude 파일을 연다. vim .git/info/exclude 2. 파일 추가 i를 눌러 insert 모드로 변경한 후 제외시키고 싶은 파일을 적는다. (.gitignore와 형식 동일) 이후 esc를 누른 후 :wq 로 저장하고 나온다. # git ls-files --others --exclude-from=.git/info/exclude # Lines that start with '#' are comments. # For a project mostly in C, the following would be a good set of # exclude patterns (uncomment them if you want..