본문 바로가기

Spring/일정관리 프로젝트

Spring Security와 쿠키+세션 기반 로그인 인증, 인가 간결 구현 프로젝트를 진행 중, Spring Security라는 개념을 알게 되었고이를 잘만 활용하면 이전에 구현했던 로그인필터 및 여러 클래스들을 과감히 삭제하고,Security Config + 인증/인가 예외처리 클래스 이 2개만으로 간단하게 인증 / 인가 시스템을 구현할 수 있을거같다는 생각이 들어서 공부해보고 적용해보기로 했습니다. 하지만, 기존의 것들을 다 삭제하고 새로 만들고 컨트롤러와 서비스 레이어에서의 로직들을 다 수정을 해주는 작업이 생각보다 쉽지 않았습니다. 하지만 노력끝에 완성하고 보니 정말 하길 잘했다고 생각이 듭니다. 코드의 간결함이 차원이 달라졌습니다!쓰기 쉬운 코드보다는 읽기 쉬운 코드가 좋다고 생각하는데 이에 맞게 수정을 잘 한 것 같습니다. 1. 왜 Spring Security인가?.. 더보기
Spring ArgumentResolver를 활용하여 컨트롤러 코드 줄여보기 오늘은 스프링 부트(Spring Boot) 애플리케이션에서 반복적인 컨트롤러 코드를 줄이고, 가독성을 높이는 데 아주 유용한 HandlerMethodArgumentResolver(이하 ArgumentResolver)에 대해 이야기해보려고 합니다. 특히 로그인한 사용자 정보를 컨트롤러 메소드 파라미터로 깔끔하게 받아오는 @LoginUser 어노테이션을 직접 만들어 적용한 과정을 공유해보겠습니다. 우리가 마주했던 문제점: 컨트롤러의 반복적인 코드API를 개발하다 보면, 많은 엔드포인트에서 현재 로그인한 사용자의 정보를 필요로 합니다. 예를 들어, 특정 사용자의 게시글을 작성하거나, 프로필 정보를 수정하는 경우죠. 기존에는 주로 다음과 같이 HttpServletRequest에서 세션을 직접 가져와 사용자 정보.. 더보기
Spring 컨트롤러 메서드의 파라미터에 자동으로 바인딩해주는 기능 과제를 진행하던 중에 코드 리펙토링을 하려고 쭉 돌아보는데컨트롤러 레이어에서 로그인 여부에 대한 로직이 각 메핑마다 반복되는 걸 보았다.이에 불편함을 느껴서 이를 해결할 방법을 찾아보다가, Spring ArgumentResolver라는 개념을 알게 되었다. Spring ArgumentResolver란?스프링 MVC에서는 컨트롤러 메서드의 파라미터에 값을 자동으로 바인딩해주는 기능이 있다.예를 들어, @RequestParam, @PathVariable, @RequestBody 등은 모두 내부적으로 ArgumentResolver에 의해 처리된다. HandlerMethodArgumentResolve 는 스프링에서 컨트롤러 메서드의 파라미터를 어떻게 처리할지를 결정하고, 필요한 값을 주입해주는 인터페이스다.. 더보기
Spring [트러블슈팅] 부모(User) 삭제 시 자식(Schedule) 엔티티 함께 삭제하기 (CascadeType.REMOVE, orphanRemoval) validation을 사용하여 dto에 여러 검증 기능을 넣어주었다.그 후에 실행을 해주고, 유저 삭제 요청을 포스트맨으로 보냈는데, 에러가 났다.그 에러를 해석해보니 오류 메시지는 "부모 행(=User)을 삭제·수정하려 했지만, 해당 user를 참조하는 자식 Schedule 레코드가 남아 있기 때문에 삭제/수정이 거부됐다"는 뜻이었다.원인데이터베이스에서 User를 삭제하려고 할 때해당 사용자가 등록한 Schedule(일정)들이 DB에 남아 있어서,schedule.user_id가 외래키(FK)로 User를 참조하고 있기 때문 해결 방법: JPA 연관관계에 Cascade 옵션 적용User 엔티티에 아래처럼 수정이 필요@OneToMany(mappedBy = "user", cascade = CascadeTyp.. 더보기
Spring [트러블슈팅] 로그인 기능 로그인 기능을 구현한 후에 기존의 기능들을 싹 다 수정했다.그 이유는 로그인 요청, 유저 생성 (회원가입) 빼고는 로그인이 되었을 때만 기능을 사용할 수 있도록 설정을 해놓는게 맞다고 생각했기에 수정을 진행했다. 예시 코드 :private Long getLoginUserId(HttpServletRequest request) { // HTTP 요청 객체를 받아 로그인한 유저의 ID를 구한다는 의미 return (Long) request.getSession(false).getAttribute("userId"); // 현재 요청에 대한 세션 객체를 가져와주고 // false를 넣었으니 세션이 없으면 새로 만들지 않고 null을 반환한다. // 세션이 존재하면, 그 세션에서 userId 라는.. 더보기
Spring 쿠키(Cookie)와 세션(Session) 기반의 인증/인가 웹 애플리케이션에서 로그인 상태를 유지하고 접근 권한을 제어하는 핵심 기술인 쿠키와 세션용어의미예시인증 (Authentication)"너 누구야?" 사용자가 누구인지 확인이메일/비밀번호 입력 후 로그인인가 (Authorization)"너 이거 해도 돼?" 권한 있는지 확인관리자만 글 삭제 가능 쿠키(Cookie)란?쿠키는 브라우저(클라이언트)에 저장되는 작은 데이터 조각서버가 클라이언트에게 쿠키를 내려주면, 이후 요청마다 자동으로 쿠키를 같이 전송Set-Cookie: SESSIONID=abc123; Path=/; HttpOnly 세션(Session)이란?세션은 서버에 저장되는 사용자 상태 정보브라우저에서 쿠키로 전달된 세션 ID를 사용해, 서버는 해당 사용자의 상태(예: 로그인 여부)를 식별흐름 요약:클.. 더보기
Spring Container & Bean 등록부터 Validation까지 Spring Container 란? Spring 애플리케이션의 객체 생명주기를 관리하고, 의존성 주입(Dependency Injection)을 수행하는 컨테이너.Spring이 관리하는 객체를 Bean이라 부른다.Bean 등록 방법Component Scan + Component 계열 애너테이션자동 등록 방식@Component가 핵심이며, 다음 애너테이션도 포함된다. :@Controller: 웹 요청 처리@Service: 비즈니스 로직@Repository: 데이터 접근 계층 (예외 변환 포함)수동 등록 (Java Config)@Configurationpublic class AppConfig { @Bean public UserService userService() { return new.. 더보기
[트러블슈팅] Spring의 글로벌 예외 처리와 커스텀 예외 클래스 @RestControllerAdvice 란?전역 예외 처리컨트롤러에서 발생하는 예외를 전역적으로(즉, 모든 컨트롤러에 대해 공통적으로) 처리할 수 있다.각 예외 유형마다 별도의 메서드를 만들어, 상황에 맞는 HTTP 상태 코드와 메시지를 반환할 수 있다.RestController와의 통합내부적으로 @ControllerAdvice와 @ResponseBody를 결합한 것과 같다.즉, 반환값이 자동으로 JSON, XML 등 REST 응답 형태로 변환코드 중복 감소개별 컨트롤러마다 try-catch를 두지 않아도 되며, 예외 처리 로직을 한 곳에서 일관되게 관리할 수 있다.정리 : REST API에서 발생할 수 있는 다양한 상황을 전역적으로, 효율적이고 일관되게 처리하기 위한 도구 @ExceptionHandl.. 더보기