분류 전체보기
이것이 취업을 위한 백엔드 개발이다 with 자바
개요 - 제목: 이것이 백엔드 개발이다 - 내용: 백엔드 개발의 전반적인 기본지식을 알려주는 도서 - 출판사: 한빛미디어 - 저자: 이준형 - 별점: ★★★★☆ - 한줄평: 백엔드 개발자를 준비하는 이들에게 적극 추천! 목차 - PART 01 백엔드 개발자 취업, 무엇을 어떻게 준비할까? - PART 02 백엔드 개발을 위한 필수 기본 지식 - PART 03 과제 테스트를 위한 백엔드 애플리케이션 개발하기 - PART 04 실전 과제 테스트 문제 자료 - github: https://github.com/lleellee0/java-for-backend - youtube: https://www.youtube.com/playlist?list=PLVsNizTWUw7FBMFX9pezh5Gxg5AtNmoMv 리뷰 ..
CORS preflight와 인증 필터 오류
cors 개념은 인파님 블로그를 참고하자. 프론트와 api 연동 중 cors 에러가 발생했다. 어라라? 이전에는 잘 작동했는데.. 갑자기? A api는 되고, B api는 안되고.. 내가 알고있던 지식으로는 전혀 이해가 가지 않았다. 분명히 webConfig에서 해당 프론트 도메인에 관한 origin은 열어주었는데 말이다. 로그와 개발자 도구를 확인해보았다. 알아보니 preflight 요청이 정상적으로 응답되지 않아 발생한 문제였다. 인증이 필요한 api에서 preflight 요청이 왔는데 해당 preflight에 인증 헤더가 없어서 401에러가 발생하였고, preflight 요청이 정상적으로 돌아오지 않자 이후 실제 api요청은 보내지 않은채 cors 에러가 발생한 것이다! preflight는 opti..
데드락 이슈(외래키 s-lock)
hyper-link(통합플랫폼)의 테이블 구조는 member와 content의 다대다 관계를 막고자 중간에 member_content테이블을 두었다. 그래서 좋아요 클릭시 member_content의 컬럼이 insert되고, content테이블의 like_count컬럼 값이 증가한다. 이를 바탕으로 좋아요 API는 memberContent 저장 후, content테이블의 like_count를 증가하는 로직으로 구현하였다. 구현 후에, 동시성 테스트를 진행하는데, 데드락이 발생했다. 찾아보니 외래키가 존재하는 자식 테이블의 insert, update, delete시 부모테이블의 존재를 확인하기 위해 해당 컬럼에 s-lock을 건다고 한다. 따라서 아래와 같은 상황이 발생한 것으로 예상된다. 각 스레드가 서..
refreshToken 저장위치와 형태 고민
RefreshToken의 저장 위치(LocalStorage vs Cookie) LocalStorage - 장점: 편리성 - 단점: XSS 취약 쿠키 (httpOnly + secure) - 장점: XSS에 다소 강함(httpOnly + secure) - 단점: CSRF에 취약 결정 hyper-link(통합플랫폼)에서는 refreshToken을 쿠키에 저장하기로 결정했다. 왜냐하면 httpOnly와 secure 옵션을 주면 XSS에 LocalStorage보다 상대적으로 덜 취약하기 때문이다. 물론 쿠키는 CSRF에 취약하다는 단점이 존재한다. 하지만 우리가 저장하는 것은 refreshToken이다. CSRF 공격이 오더라도, refreshToken만을 가지고는 비지니스 데이터에 영향을 줄 수 없다. 왜냐하..
인증 방식 고민(SlidingSession VS RefreshToken)
AccessToken만 사용 짧은 만료 시간: 장점: 토큰 탈취당해도 빠르게 만료 가능 단점: 사용자가 자주 로그인 해야함(불편함) 긴 만료 시간: 장점: 사용자가 로그인 자주할필요X(편함) 단점: 토큰 탈취시 오랫동안 제약없이 사용 Sliding Sessions + AccessToken AccessToken을 가진 클라이언트의 요청에 대해 서버가 새로운 AccessToken을 발급해주는 방법 (요청때마다 새롭게 AccessToken 발급) 장점: 로그인을 자주 할 필요 X 글을 작성, 결제 등 세션 유지가 필요한 순간에 세션 만료 문제를 방지 단점: 접속이 주로 단발성으로 이루어지는 서비스의 경우효과가 크지 않음 긴 만료 시간을 갖는 AccessToken 사용하는 경우, 로그인을 전혀 하지 않아도 되는..
cookie 미적용 문제(same-site)
refreshtoken을 쿠키에 저장하기로 결정했다. 구현 후 프론트와 연동을 진행하는데, 쿠키가 적용되지 않았다. 개발자 도구에서 응답 메시지를 보니 set-cookie는 잘 동작했다. 하지만 왜 브라우저에서는 저장이 되지 않는 걸까? 찾아보니 원인은 same-site 정책 때문이었다. cookie에서도 cors처럼 Origin이 다를 경우에 각 브라우저마다 정해놓은 보안정책이 존재했다. 구글 크롬에서는 same-site 정책을 none으로 설정할 경우 secure가 true인 경우만 쿠키 저장이 가능했다.(https) (확인해보니 사파리에서도 동일하다) 이제 개념적으로 좀 더 알아보자. Third-party 쿠키와 First-party 쿠키 서드 파티 쿠키: 사용자가 접속한 페이지와 다른 도메인으로 ..
multipartForm 415 에러..
이미지 파일 전송을 위하여 multipartForm을 사용하였고, 이미지와 관련된 데이터들을 json 데이터와 함께 서버로 post 요청 하였다. 하지만 .. HttpMediaTypeNotSupportedException 발생.. 뭐지?? 컨텐트 타입과 관련된 415 에러였다.. 왜 발생한것일까..? 알아보니 byte값을 역직렬화 하는 MultipartResolver에서 스트링 값이 오니 오류가 난 것으로 추측된다. 스프링에서 @RequestPart의 역직렬화는 MultipartResolver로 진행된다. 하지만 나는 서버단에서는 @RequestPart를 사용하고, 클라이언트 단에서는 기존 http 통신을 하듯이 json을 스트링 값으로 보내서 해당 에러가 발생한 것이다. 따라서 @RequestPart ..
JPA nativeQuery interface 리턴
당근 마켓 클론코딩중 거리 계산을 위해 ST_Distance_Sphere()를 사용하기로 했다. ST_Distance_Sphere()는 jqpl에서는 동작하지 않으므로 nativeQuery를 사용해야 했다. 뭐 평소에 사용하던 jqpl문에서 실제 쿼리문으로만 약간만 변경 한 뒤, nativeQuery 옵션만 true를 넣어주면 실행될 꺼라 생각했다. 하지만 오늘도 여지없이 오류가 발생.. native쿼리 구현 후 dto로 리턴받으려고 하니 문제가 발생하였다. 아차.. jpql에서 사용하는 방법인 new 패키지.dto생성자 전략을 사용하니 당연히 문제가 될 수 밖에 없었다.. 허허 이후에 검색해 보니 nativeQuery에서는 인터페이스로 가져오는 방법이 존재하였다. 따라서 아래와 같이 구현! @Query..
Java CallByValue vs CallByReference
Call-By-Value, Call-By-Reference란? CallByValue: 메소드 호출시 변수의 ‘값’을 전달하는 방식 (메소드 호출시에, 피호출자 메서드의 매개변수에 (본래) 호출자 변수의 복제값을 전달 하는방식) CallByReference: 메소드 호출시 변수의 주소값을 전달하는 방식 (피호출자 메서드의 매개변수에 (본래)호출자 변수의 주소(고유 식별자)를 메서드로 전달하는 방식) JVM 메모리에 변수가 저장되는 위치 먼저 Java에서 변수 생성 시 메모리에 어떤 식으로 저장되는지 알아보자. Java에서 변수를 선언하면 Stack 영역에 할당된다. 여기서 변수가 원시 타입(Primitive Type)이라면 Stack 영역에 변수와 함께 저장된다. 반면에 참조 타입(Reference Typ..
Checked Exception vs UncheckedException
에러와 예외 프로그래밍에서 예외란 입력 값에 대한 처리가 불가능하거나, 프로그램 실행 중에 참조된 값이 잘못된 경우 등 정상적인 프로그램의 흐름을 어긋나는 경우를 말한다. 그리고 자바에서 예외는 개발자가 직접 처리할 수 있기 때문에 예외 상황을 미리 예측하여 핸들링할 수 있다. 그러나 에러는 시스템에 무엇인가 비정상적인 상황이 발생한 경우를 말한다. 주로 자바 가상 머신에서 발생하는 것이며, 예외와 반대로 이를 애플리케이션 코드에서 잡을 수 없다. 에러의 예시로는 OutOfMemoryError, ThreadDeath, StackOverflowError 등이 있다. 자바 예외 구분 checked vs unchecked 이번 글의 제목처럼 Exception은 Checked Exception과 Unchecke..