Java Framework 33

[Spring] MockMvc

MockMvcMockMvc는 실제 서블릿 컨테이너(톰캣 등)를 구동하지 않고도 Spring MVC Controller를 HTTP 요청 관점에서 테스트할 수 있게 해주는 클래스입니다.즉, Spring의 DispatcherServlet, Controller, ArgumentResolver, Validator, ExceptionHandler 등 MVC 전체 흐름을 테스트 환경에서 그대로 재현할 수 있습니다.내부 원리MockMvc는 DispatcherServlet을 모의(Mock) 환경에서 동작시키고, HTTP 요청을 가상의 요청 객체 (MockHttpServletRequest)로 전달합니다.이를 통해 실제 웹 브라우저에서 요청한 것처럼 Request Mapping, 파라미터 바인딩, 응답 객체 생성, 예외 처..

[Lombok] @Data

@DataJava에서는 객체지향 프로그래밍을 위해 필드에 대한 접근을 캡슐화(encapsulation)하며, 이에 따라 getter, setter, equals(), hashCode(), toString() 등의 메서드를 반복적으로 작성해야 하는 불편함이 존재합니다.이를 해결하기 위해 등장한 것이 바로 Project Lombok이며, Lombok의 @Data 어노테이션은 이러한 보일러플레이트 코드를 자동으로 생성해줍니다.@Data의 내부@Data는 Lombok이 제공하는 어노테이션 중 하나로, 해당 클래스에 대해 다음과 같은 기능을 자동으로 생성합니다@Getter: 모든 필드에 대해 getter 메서드 생성@Setter: 모든 필드에 대해 setter 메서드 생성@ToString: toString() 메..

@AuthenticationPrincipal

@AuthenticationPrincipalSpring Security에서 로그인한 사용자의 정보를 컨트롤러 메서드 파라미터로 간편하게 주입해주는 어노테이션Spring Security의 SecurityContextHolder에 저장된 인증 객체(Authentication)로부터 Principal 정보를 꺼내서, 컨트롤러 파라미터에 주입함내부적으로는 SecurityContextHolder.getContext().getAuthentication().getPrincipal()을 호출하는 것과 같음📦 내부 구조로그인하면 Spring Security가 이 과정을 자동으로 처리한다.사용자가 로그인 → Authentication 객체 생성Authentication.getPrincipal()에 로그인한 사용자 정보(..

[Lombok] AccessLevel

AccessLevel Lombok에서 제공하는 열거형(enum)으로, 어노테이션(@Builder, @NoArgsConstructor, @AllArgsConstructor 등)이 생성하는 메서드나 생성자의 접근 제어자를 지정할 수 있다.🔑 AccessLevel 종류와 의미AccessLevel설명PUBLICpublic 접근자 (어디서나 호출 가능)PROTECTEDprotected 접근자 (같은 패키지 또는 자식 클래스에서만 접근 가능)PACKAGE / MODULE패키지 전용 접근자 (package-private)PRIVATEprivate 접근자 (클래스 내부에서만 사용 가능)NONE아예 생성하지 않음 (생성자나 메서드를 생성하지 않도록 설정)예시 @Builder(access = AccessLevel.PRI..

[Spring] 단위 테스트(Unit Test) vs 통합 테스트(Integration Test)

단위 테스트(Unit Test)단위 테스트는 DB 없이 서비스 로직을 검증하는 테스트이다.Spring을 실행하지 않고 Mockito로 필요한 객체를 Mock 처리해서 사용한다.📌 단위 테스트 코드 예시@ExtendWith(MockitoExtension.class) // Spring 실행 없이 Mockito만 사용class UserServiceTest { @Mock // 가짜 객체(Mock) 생성 private UserRepository userRepository; @InjectMocks // UserService가 위의 Mock 객체를 사용하도록 설정 private UserService userService; @Test void findUserById() { ..

[Spring Boot] Generic

Generic제네릭(Generic)은 클래스나 메서드에서 사용할 데이터 타입을 컴파일 타임에 미리 지정하지 않고, 필요할 때 지정할 수 있도록 해주는 기능입니다. 즉, 다양한 타입의 데이터를 처리할 수 있도록 유연성을 제공하는 기능입니다.제네릭 는 타입 파라미터로, 다양한 타입의 데이터를 담을 수 있게 해줍니다.Generic@JsonInclude(JsonInclude.Include.NON_NULL)@AllArgsConstructor@Getterpublic class RsData { // 제네릭 타입 T 선언 private String resultCode; private String msg; private T data; // 제네릭 타입을 가진 변수 public RsData(Strin..

[Spring Boot] JpaRepository Optional

JpaRepository의 findById()public interface JpaRepository { Optional findById(ID id); // ID로 엔티티를 찾을 때 Optional 반환} 왜 Optional을 사용하나요?1. 존재하지 않는 ID 조회 가능성// id=999인 게시글이 없을 때Post post = postRepository.findById(999L).get(); // NoSuchElementException 발생 2. null 체크의 명시적 처리// 예전 방식 (null 체크)Post post = postRepository.findById(id);if (post == null) { throw new PostNotFoundException();}// Option..

[Spring] JPA Specification

JPA SpecificationJPA Specification은 Spring Data JPA에서 제공하는 도구로, 복잡한 데이터베이스 쿼리를 SQL 문자열로 작성하는 대신 Java 객체와 메서드로 표현하여 객체지향적으로 작성할 수 있게 도와줍니다. 이를 통해 코드의 가독성과 재사용성이 높아지고, 유지보수가 쉬워집니다.특징1. 객체지향적 쿼리 작성JPA Specification은 SQL 대신 Java 객체를 사용하여 쿼리를 작성합니다.SQL: SELECT * FROM customers WHERE name = 'John' AND age > 30;객체지향적 표현: Specification.where(nameEquals("John")).and(ageGreaterThan(30));2. 재사용 가능한 조건각 조건을..

[Spring Security] 역할 기반 접근 제어 (RBAC) feat. Role

역할 기반 접근 제어 (RBAC)애플리케이션에서는 사용자마다 다른 권한을 가지는 경우가 많습니다. 예를 들어, 관리자는 시스템을 관리할 수 있지만, 일반 사용자는 자신의 데이터만 접근하도록 제한해야 합니다. 이런 차이를 구현하려면 역할 기반 접근 제어(Role-Based Access Control, RBAC)가 필요합니다.역할(Role) : 사용자의 직무나 그룹을 나타냅니다. ex. ADMIN, USER권한(Authority):  Spring Security가 사용하는 실제 권한 이름으로, 보통 ROLE_ 접두사를 사용합니다. ex. ROLE_ADMIN, ROLE_USERSpring Security 역할 기반 접근 제어package com.example.security.roles;import lombok..

[Spring Security] 보안

1. CSRF (Cross-Site Request Forgery)CSRF는 사용자가 의도하지 않은 요청을 서버로 전송하도록 속이는 공격입니다. 로그인 상태의 사용자를 대상으로 악성 요청을 실행할 수 있어 보안에 매우 위험합니다.ex. 사용자가 은행 웹사이트에 로그인한 상태에서 악성 링크를 클릭하면, 공격자가 사용자 계정으로 돈을 송금하는 요청이 전송될 수 있습니다.1. Spring Security의 CSRF 방지Spring Security를 사용하면 CSRF 보호가 기본으로 활성화됩니다.POST, PUT, DELETE 등의 요청 시, CSRF 토큰을 요구합니다.2. 예시 Submit name="_csrf": 서버에서 지정한 CSRF 토큰의 파라미터 이름value="1a2b3c4d5e6f7g8..