tech/Spring 15

[Spring] 스프링 빈과 스프링 컨테이너

이 두 가지 개념은 제어의 역전(IoC, Inversion of Control)이라는 스프링의 대원칙을 실현하는 가장 기초적인 구조이다. 먼저 이 두가지가 무엇인지 간단히 알아보면 1. 스프링 컨테이너 (Spring Container)스프링 컨테이너는 자바 객체의 생명 주기를 관리하는 관리자라고 생각하면 편하다.정의: 개발자가 작성한 코드의 처리 과정을 위임받아 독립적으로 처리하는 존재이다.핵심 역할:객체 생성: 개발자가 new 키워드로 객체를 직접 생성하지 않고, 컨테이너가 대신 생성한다.관계 설정 (DI): 객체 간의 의존 관계(어떤 객체가 어떤 객체를 필요로 하는지)를 연결해 준다.생명 주기 관리: 객체의 생성부터 소멸까지의 과정을 관리한다.대표적인 인터페이스:ApplicationContext: 가..

tech/Spring 2025.12.16

[Spring] 인증(Authentication)과 인가(Authorization)

저번 글에서는 Spring security에 대해서 알아보았다. https://sunm2n.tistory.com/66 [Spring] SpringSecurity란?Spring Security는 자바(Java) 기반의 애플리케이션(특히 Spring 프레임워크)에서 보안(인증 및 인가)을 담당하는 가장 강력하고 표준적인 프레임워크이다. 쉽게 비유하자면, 웹 사이트라는 '건물'을 지sunm2n.tistory.com Spring security를 공부하기 위해서 꼭 알아야 할 개념인 인증과 인가에 대해서 알아보자. 인증(Authentication)과 인가(Authorization)는 보안의 가장 기초이면서, 실무자들도 용어를 섞어 쓸 만큼 자주 헷갈리는 개념이다.하지만 이 둘은 명확히 다르다. 가장 쉽게 이해할..

tech/Spring 2025.12.03

[Spring] SpringSecurity란?

Spring Security는 자바(Java) 기반의 애플리케이션(특히 Spring 프레임워크)에서 보안(인증 및 인가)을 담당하는 가장 강력하고 표준적인 프레임워크이다. 쉽게 비유하자면, 웹 사이트라는 '건물'을 지킬 때 입구에 배치하는 최첨단 경비 시스템과 같다.1. 핵심 개념: 인증과 인가Spring Security를 이해하려면 두 가지 단어를 반드시 구분해야 합니다.인증 (Authentication): "당신은 누구입니까?"사용자의 신원을 확인하는 절차이다.예: 로그인(ID/Password 입력), 지문 인식, OTP 등인가 (Authorization): "당신은 무엇을 할 수 있습니까?"인증된 사용자가 특정 리소스에 접근할 권한이 있는지 확인하는 절차이다.예: 일반 사용자는 내 정보만 볼 수 있..

tech/Spring 2025.12.03

[Spring] @Valid와 @Validated

@Valid와 @Validated는 모두 유효성 검증(Validation)을 위해 사용되지만, 제공 주체와 핵심 기능에 차이가 있다. 1. @Valid (Java 표준)제공자: Java 패키지: javax.validation.Valid (Spring Boot 2.x) 또는 jakarta.validation.Valid (Spring Boot 3.x)핵심 기능: 중첩된 객체(Nested Object)의 유효성 검사를 실행하도록 지시한다.@Valid는 컨트롤러 메서드의 파라미터(ex. @RequestBody)나 DTO 내부의 필드에 붙어, "이 객체의 필드도 검증해줘"라고 알리는 역할을 한다. 예시 (DTO 내부의 중첩된 객체 검증):public class UserRequest { @NotBlank(me..

tech/Spring 2025.11.12

Java에서 컬렉션 sort 동작 방식

컬렉션에 담겨있는 요소의 타입에 따라 Java 컬렉션의 sort가 달라지는 걸 몰랐다. 그냥 timsort 아닌가? 라고 생각을 했었다. 아니였다. 원시타입의 경우에는 Dual-Pivot Quicksort를 쓴다.객체타입의 경우에는 TimSort를 쓴다. 그렇다면 왜 타입에 따라 다르게 sort를 할까? 정렬 대상을 원시 타입(primitive)과 객체 타입(object)으로 나누어 다른 정렬 알고리즘을 사용하는 것은 성능 최적화와 안정성(Stability)이라는 두 마리 토끼를 잡기 위해서이다. 좀 더 자세히 알아보자 1. 듀얼 피벗 퀵 정렬 (Dual-Pivot Quicksort)대상: Arrays.sort(int[]), Arrays.sort(double[]) 등 원시 타입 배열이 알고리즘은 Jav..

tech/Spring 2025.11.05

[Spring] @ActiveProfiles("test") vs @DataJpaTest

@ActiveProfiles("test") 🚀@ActiveProfiles("test")는 스프링 컨테이너에 특정 테스트 클래스를 실행할 때 **"test"**라는 이름의 스프링 프로파일을 활성화하도록 지시하는 범용적인 어노테이션입니다. 이 어노테이션을 사용하면 애플리케이션의 운영 환경과 테스트 환경의 설정을 분리하여 관리할 수 있습니다.주요 기능:프로파일 기반 설정 활성화: application-test.properties 또는 application-test.yml 파일의 설정을 로드합니다.빈 조건부 로드: @Profile("test") 어노테이션이 붙은 빈들을 스프링 컨테이너에 등록합니다.사용 범위: @SpringBootTest와 같은 전체 컨텍스트를 로드하는 테스트에서 주로 사용됩니다.@DataJp..

tech/Spring 2025.08.21

[Spring] @Builder(toBuilder = true)

1. @Builder 란?생성자/빌더 패턴을 자동으로 만들어 주는 Lombok 어노테이션이다. BoardDto dto = BoardDto.builder() .userId(123L) .nickname("홍길동") .title("제목") .build(); 객체 생성시 위와 같이 필드명.값 형태로 가독성 높게 객체를 만들 수 있다. 2. @Builder(toBuilder = true)toBuilder = true를 쓰면 이미 만들어진 객체에서 일부 값만 바꿔서 새 객체를 만드는 빌더를 자동으로 추가해준다. BoardDto a = BoardDto.builder() .userId(1L) .nickname("닉네임") .title("제목1") .build();BoardDto b = a.toBui..

tech/Spring 2025.07.24

[Spring] N + 1 문제

N+1 문제란? N+1 문제란, 하나의 쿼리(1)를 실행한 이후에, 연관된 엔티티를 가져오기 위해 추가로 N개의 쿼리가 실행되는 현상이다.이로 인해 총 1 + N개의 쿼리가 실행되어 성능 저하가 발생한다. 예를 들어, Member와 Team이라는 두 개의 엔티티가 있고, Member는 Team에 대해 다대일(N:1) 관계를 가지고 있다고 가정하면 @Entitypublic class Member { @Id private Long id; private String name; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id") private Team team;}@Entitypublic class Team { @Id private L..

tech/Spring 2025.07.18

[Spring] Config

관심사의 분리 애플리케이션을 하나의 공연이라 생각해보자. 각각의 인터페이스를 배역(배우 역할)이라 생각하자. 그런데! 실제 배역 맞는 배우를 선택하는 것은 누가 하는가? 로미오와 줄리엣 공연을 하면 로미오 역할을 누가 할지 줄리엣 역할을 누가 할지는 배우들이 정하는게 아니다. 이 전 코드는 마치 로미오 역할(인터페이스)을 하는 레오나르도 디카프리오(구현체, 배우)가 줄리엣 역할(인터페이 스)을 하는 여자 주인공(구현체, 배우)을 직접 초빙하는 것과 같다. 디카프리오는 공연도 해야하고 동시에 여자 주인공도 공연에 직접 초빙해야 하는 다양한 책임을 가지고 있다. 관심사를 분리하자 배우는 본인의 역할인 배역을 수행하는 것에만 집중해야 한다.디카프리오는 어떤 여자 주인공이 선택되더라도 똑같이 공연을 할 ..

tech/Spring 2025.07.09