🍀 Spring Boot

    [Spring] filter 내에서 발생한 예외 처리하기 || AuthenticationEntryPoint, AccessDeniedHandler

    들어가며 이전 포스팅에서 전역 예외 핸들러를 만들어주며, 서비스에서 발생하는 Exception을 처리해주는 과정을 정리해보았습니다. 그러나, 필터에서의 예외는 해당 핸들러로 처리할 수가 없습니다. 따라서, 인가와 인증 과정을 거치는 필터 내에서 발생하는 예외를 처리하는 과정을 다뤄보겠습니다. ❏ 요청과 응답의 과정 먼저, 요청과 응답이 어떠한 과정을 거치는 지부터 간단하게 정리해보겠습니다. 1. 클라이언트로부터 들어온 요청은 Servlet Filter를 거치게 됩니다. 해당 과정을 통해 필요한 수정이나 처리 과정을 거치게 되며, 필터를 통과한 요청은 DispatcherServlet으로 전달되게 됩니다. 2. DispatcherServlet은 클라이언트로부터 들어온 요청을 검사하여 적절한 Controlle..

    [Error] h2-console 403 오류 해결

    들어가며Spring에서 MariaDB를 사용해오다가, 최근에 친구와 H2로 DB를 사용하는 과정에서 403 오류가 계속 발생하였다. 이 문제를 간단하게 해결하는 과정을 포스팅해본다..!📌 h2-console 403 오류 해결프로젝트를 실행한 후, h2-console로 접근 시, 403 오류로 DB를 열어볼 수가 없었다. 이를 해결하기 위해 SecurityConfig 클래스를 살펴보았다. "/h2-console/**"로 다른 api처럼 permitAll을 해주어도 해결되지 않았고,, 다음과 같이 설정해주니 해결되었다. @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http, AuthenticationConfiguration authen..

    [Spring] Exception 처리 과정 || ErrorCode, CustomException, ControllerAdvice

    ❏ ErrorCodeErrorCode는 Enum 타입으로, 반복적으로 사용되는 Error 상태와 메시지를 포함합니다. Enum 타입으로 미리 에러코드와 메시지를 정의해두며, 편리하게 활용합니다.@Getter @RequiredArgsConstructor public enum ErrorCode { INVALID_TOKEN(401, "Token이 유효하지 않습니다."), ACCESS_DENIED(403, "접근 권한이 없습니다."), MEMBER_NOT_FOUND(404, "존재하지 않는 회원입니다."), AUTHENTICATION_FAILED(400, "아이디 또는 비밀번호가 옳지 않습니다."), BOARD_NOT_FOUND(404, "존재하지 않는 게시물입니다."), BOARD_AUTHOR_MISMATCH..

    [Error] unable to evaluate the expression method threw 'org.hibernate.lazyinitia

    [Error] unable to evaluate the expression method threw 'org.hibernate.lazyinitia

    📌 오류 발생 원인Member member = memberRepository.findById(Long.valueOf(memberId)) .orElseThrow(() -> new UsernameNotFoundException("존재하지 않는 계정입니다.")); Authentication authentication = jwtProvider.getAuthentication(member);먼저, memberRepository에서 findById를 통해 Member(회원) 엔티티를 조회해온다. public Authentication getAuthentication(Member member) { MemberContext memberContext = new MemberContext(member); return new..

    [Spring] 공통 필드 하나로 묶기! || BaseEntity, JpaAuditing

    들어가며 Member, Order, Board 등 다양한 엔티티를 생성하여 사용하다보면, 반복되는 공통 속성이 존재하게 됩니다. 예를 들면, 생성일, 수정일, 식별자 등이 있으며, 보통 하나로 묶어 BaseEntity를 생성하여 각 엔티티가 상속받을 수 있도록 구현하며 사용하곤 합니다. 본 포스팅에는 공통 속성을 하나로 묶어 BaseEntity라는 부모 클래스를 생성하는 내용을 소개합니다. 📌 공통 속성public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String password; private LocalDateTime crea..

    'authorizeRequests()' is deprecated 해결 || Spring Security Configuration

    'authorizeRequests()' is deprecated 해결 || Spring Security Configuration

    기존에 사용해오던 방식대로 SecurityConfig를 만들어서 403 Error를 해결하고자 하였는데, authorizeRequests()가 deprecated 되었다고 한다. WebSecurityConfigurerAdapter도 deprecate되어 빈을 등록하는 방식으로 바꿔주었었는데, 이것도 바꿔보자!아래와 같이 변경하여 사용할 수 있다.http .authorizeRequests() .requestMatchers("/admin/**").hasRole("ADMIN") .requestMatchers("/**").hasRole("USER") .and().formLogin(); return http.build();antMatchers를 requestMatchers로 변경. authorizeRequest는..

    [Spring] 의존성 주입(DI, Dependency Injection) (생성자 주입을 사용해야 하는 이유)

    [Spring] 의존성 주입(DI, Dependency Injection) (생성자 주입을 사용해야 하는 이유)

    📌 DI(Dependency Injection)DI(Dependency Injection)이란, 객체를 직접 생성하는 것이 아니라 외부에서 생성 후 주입시켜주는 방식이다. 즉, 의존 관계를 외부에서 결정하고 주입하는 것을 의미한다. interface Book { // 더 다양한 Book을 의존받을 수 있도록 인터페이스로 추상화 ... } class ScienceBook implements Book { ... } class EnglishBook implements Book { ... } public class Library { private Book book; public Library() { this.book = new ScienceBoo..

    [Spring] JPA N + 1 문제 발생 원인 및 해결 방안

    [Spring] JPA N + 1 문제 발생 원인 및 해결 방안

    📌 JPA N + 1 문제란?조회된 데이터 개수만큼, 연관 관계의 조회 쿼리가 추가로 발생하는 문제를 의미한다. EX) 카테고리와 게시글@Entity @NoArgsConstructor @Setter @Getter public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; private String content; @ManyToOne private Category category; public Board(String title, String content, Category category) { this.title = title; this.content = co..

    [Error] 해결 org.springframework.validation.BindException: org.springframework.val

    Validation을 이용하여 값이 입력되었는지 등등을 설정해주었다.@AllArgsConstructor @Getter public class QuestionForm{ @NotEmpty(message = "제목은 필수 항목입니다.") @Size(max = 200, message = "제목을 200자 이하로 입력해주세요.") private String subject; @NotEmpty(message = "내용은 필수 항목입니다.") private String content; } org.springframework.validation.BeanPropertyBindingResult 프로젝트를 실행시켜 값이 제대로 입력되지 않았을 경우, 에러 문구가 잘 뜨는지 확인하고자 했는데, 이러한 오류가 발생했다! 이유는,..

    [Spring] 스프링 입문 - 7. AOP

    [Spring] 스프링 입문 - 7. AOP

    스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 [무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확인해주세www.inflearn.com 인프런 김영한님 강좌인 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 내용을 학습하며 다룬 글입니다. 문제(저작권, 오류 및 잘못된 부분 등)가 있다면 알려주세요!! PREV) 스프링 입문 - 6. 스프링 DB 접근 기술 [Spring] 스프링 입문 - 6. 스프링 DB 접근 기술스프링 입문 - ..