목록분류 전체보기 (144)
개발지식 먹는 하마 님의 블로그

로그인 관련 처리와 같이 공통으로 처리해야 하는 로직들이 있다.이러한 공통 로직은 Filter, Interceptor, AOP를 활용하여 처리할 수 있다.사용 범위는 제한적이지만 필수적으로 사용되는 요소들이다.이 셋은 동작 시점, 목적, 사용 방식에서 차이가 있다. Request가 들어올 때, Filter ➡️ Interceptor ➡️ AOPResponse가 나갈 때, AOP ➡️ Interceptor ➡️ Filter FilterRequest, Response를 걸러서 전달한다.Servlet 기반, Dispatcher Servlet 이전에 동작한다.클라이언트 → 서버로의 요청 전/후에 처리여러 필터가 체인으로 연결되어 연속으로 수행될 수 있다.인코딩 처리, 로깅, 보안 검사, 인증, CORS 등을 위..
Test Code에서 라이브러리가 일부 import 되지 않는 이슈main 코드에서만 적용되도록 설정된 Gradle부분을test에서도 적용되도록 변경하였다.Jwt Filter Url 이슈

User의 정보를 담은 Token을 쿠키에 담아 사용하기회원가입 또는 로그인 성공 시, 유저의 Id, email, userRole(권한)을 담은 토큰이 문자열로 반환되도록 설계되어있었다.@Getter public class SigninResponse { private final String bearerToken; public SigninResponse(String bearerToken) { this.bearerToken = bearerToken; } }Barere Token을 문자열 형식으로 반환하고 있었기 때문에Postman에서 직접 Authorization을 입력해줘야 하는 불편함이 있었다.이를 쿠키에 Token을 담아 사용하는 방식으로 변경하였다.public ..

즉시 로딩 Eager모든 연관 데이터를 한 번에 로드한다.여러 개의 엔티티가 자주 함께 사용될 때 유용하다.쿼리 수행 횟수를 줄여 성능을 향상할 수 있다.@ManyToOne, @OneToOne지연 로딩 Lazy데이터가 실제로 필요한 시점에만 로드한다.연관 데이터가 필요하지 않은 경우에 유용하다.네트워크 트래픽을 줄이고 메모리 사용을 최적화한다.@OneToMany, @ManyToMany즉시 로딩과 지연 로딩 비교 테스트N:1 관계의 게시글과 유저가 있다고 가정하고, 아래의 테스트 코드로 테스트를 해보자.//Board 목록만 조회 List boards = em.createQuery("SELECT b FROM Board b", Board.class).getResultList();//조회 결과 출력 for (B..

🍪 Cookie클라이언트에 저장되는 작은 데이터서버는 무상태 Stateless이기 때문에 클라이언트의 상태를 보존하지 않는다.따라서, 쿠키를 사용해 사용자의 상태 또는 세션을 유지한다.🍪 Cookie를 사용하는 과정클라이언트가 로그인을 시도한다.로그인에 성공하면, 서버는 쿠키를 만들고 Set-Cookie 헤더를 통해 응답에서 쿠키를 함께 보낸다.클라이언트는 웹 브라우저 내에 있는 쿠키 저장소에 받은 쿠키를 저장한다.이후의 요청마다 클라이언트는 가지고 있는 쿠키를 요청에 함께 보낸다.🍪 Cookie의 단점쿠키는 탈취되기 쉬우며 한번 탈취된 정보는 반영구적으로 사용할 수 있다.또한, Client가 임의로 값을 변경하면 다른 유저로 인식할 수 있다.쿠키에 중요한 값을 저장하지 않는다.암호화된 Token을..

이번 팀 프로젝트에서는 시스템으로 인해 고통받았다.이런 문제가 또 발생했을 때, 빠르게 극복해낼 수 있도록 문제와 해결 방법을 정리하고자 한다.🤦♀️ IntelliJ 'Cannot resolve symbol' 에러몇 분 전까지만 해도 잘 돌아가던 프로그램이 코드를 딱 한 단어 바꾸고 재실행했을 뿐인데 오류가 발생했다.내가 겪은 오류 메시지는 캡쳐를 해놓지 않았기 때문에 다른 블로그의 오류 이미지를 첨부한다.위의 이미지와 비슷한데 내 경우에는 UserService가 import된 경로를 찾을 수 없다는 오류였다.아무리 봐도 잘못 바꾼 코드가 없고, 경로도 너무나 정확한데 오류가 해결되지 않았다.왜냐하면 그건 내 잘못이 아니었기 때문... 😭💡 해결 방법원인은 IntelliJ에서 캐시 문제로 인해 파..
✂️삭제에 대하여유저와 같은 중요한 정보를 삭제하려고 할 때,비밀번호 검증을 통해 본인이 시도를 하고 있는 것인지를 확인하는 과정이 필요하다.비밀번호는 보안을 위해 파라미터가 아닌 RequestBody를 사용해 넘겨주어야 한다.그러나 DELETE 메서드는 RequestBody를 사용하지 않는 것이 좋다고 한다.❓ 그러면 삭제를 무엇으로 하나요?주로 PATCH를 사용한다.또는세션이나 토큰 등을 이용해 비밀번호 검증이 된 상태에서만 삭제를 허용한다.(PATCH 사용에 대해서는 여전히 고려해야 할 부분이 있다.)💡 Soft Delete 논리 삭제, Hard Delete 물리 삭제논리 삭제와 물리 삭제는 삭제를 했을 때, 해당 데이터가 DB에 계속 남아있는가 아닌가의 차이이다.예를 들어, 네이버 카페가 있다고..

📅 일정 관리 프로그램Spring JPA를 이용해 구현한 일정 관리 프로그램입니다.일정 관리 프로그램은 아래의 기능들을 제공합니다.🛠️ 기능회원가입, 로그인, 로그아웃유저 이름 및 비밀번호 변경, 삭제일정 생성, 수정, 삭제댓글 생성, 수정, 삭제특정 유저가 작성한 댓글 조회특정 일정에 작성된 댓글 조회유저 아이디 또는 수정일에 따른 일정 조회🛠️ 유저 관련 기능☑️ 회원가입이름, 이메일, 비밀번호를 입력해 회원가입을 할 수 있습니다.API : /users/signup🔖 예외) 이메일 중복이때, 이메일은 다른 유저와 중복될 수 없습니다.만약 이메일이 중복인 경우 해당 이메일로 가입을 진행할 수 없습니다.🔖 예외) 잘못된 비밀번호 형식비밀번호는 영문과 숫자의 조합만 가능합니다.☑️ 로그인이메일, ..
DTODTO는 Controller - Service - Repository 계층 간 데이터를 전달하는 객체이다.(Entity에서 필요한 부분만 꺼내서 포장하는 부분이라고 생각할 수 있을 것 같다.)Entity를 직접 노출하지 않기 때문에 필드를 보호한다.또한 필요한 필드만 포함하여 성능을 최적화한다. DTO와 Entity의 차이항목DTOEntity목적데이터 전달데이터 저장사용 범위Controller - Service - Repository JPA, 데이터 베이스캡슐화비즈니스 로직 없이 데이터만 포함비즈니스 로직 포함 가능변경 가능성API에 따라 유연한 변경데이터베이스 스키마 변경 필요설계사용자(데이터를 사용하는 개발자) 친화적데이터베이스 친화적 DTO에서 Validation으로 검증하지 못한 부분을 서..

🔍 유효성 검사우리는 Request Body, RequestParam, PathVariable 등의 방식으로 클라이언트가 보낸 데이터를 받아서 처리한다.이때, 받은 데이터가 잘못된 혹은 허용되지 않는 값이거나 Null 인지 등의 여부를 확인해주어야 한다.이를 위해 데이터가 유효한 값인지 아닌지를 확인하는 유효성 검사가 필요한다.🛠️ Spring에 유효성 검사 기능 추가하기프로젝트에 유효성 검사 기능을 추가하려면 spring-boot-starter-validation 라이브러리를 의존성으로 추가해야 한다.[ Gradle ]dependencies { implementation 'org.springframework.boot:spring-boot-starter-validation'}그리고 꼭 Gradl..