전체 글59 [Spring 테스트] JUnit + Mockito로 공통코드 서비스 테스트하기 (feat. Collectors.toMap, @Mock, @InjectMocks 이해하기) Spring + Mockito 환경에서 @Mock, @InjectMocks, 그리고 Stream API의 Collectors.toMap 사용법을 정리해봤다.실습 코드를 기반으로 테스트 코드 작성법과 Stream API 사용 이유를 함께 이해해보자. 📑 예제 코드 소개아래는 공통코드 그룹핑 서비스 테스트 예제:﹡CmmnCodeServiceTestpackage wpo.wpms.common;import org.junit.jupiter.api.DisplayName;import org.junit.jupiter.api.Test;import org.mockito.InjectMocks;import org.mockito.Mock;import org.mockito.junit.jupiter.MockitoExtension;.. spring 2025. 5. 1. 스프링시큐리티 [SpringBoot 3.x (Spring Security 6.x)] 🔥 SpringBoot2.x@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() // (테스트 용, 실제는 다르게) .authorizeRequests() .antMatchers("/employees/**").authenticated() // 조회는 인증만 있으면 OK .antMatchers(HttpMethod.PUT, "/.. spring 2025. 4. 28. Git Rebase & Cherry-pick & Squash merge & Rebase merge ▶︎ git rebase와 cherry-pick에 대해 설명 ChatGPT said:rebase와 cherry-pick은 Git에서 커밋을 다른 브랜치에 적용할 때 사용하는 두 가지 주요 방식이야. 둘 다 변경 사항을 복사해서 적용한다는 공통점이 있지만, 목적과 사용 방식, 결과가 꽤 달라. 아래에 간단히 비교해서 설명해줄게. ✅ git rebase📌 개념rebase는 한 브랜치의 커밋들을 다른 브랜치의 최신 커밋 이후로 "이식"하는 명령어야.즉, 기반(base) 을 바꾸는 거지.📈 사용 예시git checkout feature git rebase mainfeature 브랜치를 main 브랜치 위로 다시 쌓음.🔄 효과커밋 히스토리가 직선(linear) 으로 깔끔해져.협업 중이면 force push .. etc 2025. 4. 25. [Lecture] 스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - (2) 📑 페이징처리와 무한스크롤📌 대규모 게시글 목록 조회는 왜 복잡할까?모든 게시글 데이터를 한 번에 조회해서 보여줄 수는 없다.메모리, 네트워크, 시스템 성능 등의 제약 때문이다.따라서 대용량 데이터를 효율적으로 보여주기 위해 페이징 처리가 필요하다.✅ 페이징을 왜 꼭 해야 하나?서버에서 모든 게시글 데이터를 한꺼번에 불러와 메모리에 올리는 것은 비효율적이다.디스크에 저장된 데이터를 메모리로 전부 불러오는 건 느리고, 디스크 I/O 비용도 크다.메모리 한계를 초과하면 OutOfMemoryError(OOM)가 발생할 수 있다.따라서 DB에서 특정 페이지만 추출하는 방식이 필요하다.이를 위해 페이징 쿼리가 사용된다. (LIMIT, OFFSET, WHERE id 🔄 페이징 방식의 종류페이징 방식은 클라이언.. infra & network 2025. 4. 20. [Lecture] 스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - (1) 📌 대규모 시스템 서버 인프라 기초Scale Up (수직적 확장) : 하드웨어 성능 향상 (ex. RAM 16 → 64GB)Scale Out (수평적 확장) : 서버 여러대, 로드 밸런서로 요청 분산Load Balancer : 트래픽을 라우팅 및 분산하기 위한 도구 (Client는 Load Balancer 로 요청을 보내면 , Load Balancer는 요청을 적절히 분산하여 서버로 전달)Cache : 서버가 요청을 처리하는 과정이 길어질 수록 응답은 느려진다. 그래서 자주 요청되는 결과를 미리 저장해두고, 다음에 또 요청이 오면 빠르게 응답해주는 저장소를 둔다.📝 캐시 종류브라우저 캐시 (프론트)서버 캐시 (Spring에서 @Cacheable)Redis같은 인메모리 캐시 서버CDN 캐시 (정적 리소.. infra & network 2025. 4. 12. Mockito Mockito는 테스트할 때 자주 쓰이는 Mock 객체 생성용 라이브러리다.1️⃣ Mock 객체란?Mock 객체는 말 그대로 가짜 객체다.실제 객체처럼 동작하지만, 내부 로직은 없고 우리가 원하는 대로 행동을 지정할 수 있다. 즉, "흉내만 내는 객체"다. 📝 예시:public interface EmailService { void sendEmail(String to, String message);} → 진짜 구현은 메일을 보내겠지만,테스트할 땐 진짜 메일을 보내면 안 되니까 Mock 객체로 대체그럼 "흉내만 낸다"는 건 무슨 뜻일까? // 실제 클래스 (진짜 메일을 보냄)public class NotificationService { public void send(String message) .. spring 2025. 4. 7. 프록시 패턴 정리 📝 프록시란 무엇인가?프록시(Proxy)란 클라이언트가 서버에 직접 요청하지 않고, 중간에 대리 객체를 통해 간접적으로 요청을 수행하는 구조이다. 이때 중간의 대리 객체가 바로 '프록시'이다. 프록시는 클라이언트와 서버 사이에 위치하여 요청을 가로채거나, 부가적인 작업을 수행하거나, 요청을 제어할 수 있다. 일반적으로 클라이언트는 자신이 요청하는 대상이 실제 서버인지, 프록시인지를 알지 못한다. 따라서 프록시는 서버와 동일한 인터페이스를 구현해야 한다. 이로 인해 클라이언트는 프록시든 서버든 동일한 방식으로 호출할 수 있으며, 구조가 변경되어도 클라이언트 코드는 전혀 영향을 받지 않는다.🏗️ 프록시 패턴의 구조프록시 패턴의 기본 구조는 다음과 같다.Client: 요청을 보내는 주체이다.Proxy: 서.. Design Pattern 2025. 4. 1. 전략 패턴(Strategy Pattern) 정리 - 템플릿 메서드 패턴과의 차이점 템플릿 메서드 패턴은 부모 추상 클래스가 변경되면 그 하위 구현체인 자식 클래스들까지 영향을 받는다는 단점이 있다.즉, 자식 클래스들이 부모 추상 클래스에 의존하고 있다는 점이 문제이다.이러한 단점을 보완한 것이 바로 전략 패턴이다.📝 전략 패턴의 기본 구조아래 첫 번째 그림처럼 Context 클래스의 execute() 메서드에 변하지 않는 로직 부분을 구현하고, 변하는 부분은 Strategy라는 인터페이스의 call() 메서드를 통해 분리한다. 이로써 상속이 아닌 위임(composition)으로 문제를 해결한다. 이는 스프링의 의존성 관리 패턴과 동일하다.전략 패턴 동작 흐름아래 그림은 전략 패턴이 동작하는 전체 흐름을 시각화한 것이다.Context에 원하는 Strategy 구현체를 주입한다.클라이언.. Design Pattern 2025. 3. 27. 싱글톤 Context에서 전략 패턴 사용 시 동시성 문제 전략 패턴을 사용할 때 Context를 싱글톤으로 설계하면 동시성 문제가 발생할 수 있다. 특히 Context 내부에 Strategy를 필드로 가지고 있고, setStrategy()로 전략을 변경하는 구조일 경우 문제의 소지가 크다.💥 문제 예시@Slf4jpublic class Context { private Strategy strategy; public void setStrategy(Strategy strategy) { this.strategy = strategy; } public void execute() { log.info("Context.execute() 호출"); strategy.call(); // 문제 발생 가능 지점 }}이 C.. spring 2025. 3. 27. [디자인 패턴] 템플릿 메서드 패턴 📝 템플릿 메서드 패턴?템플릿 메서드 패턴은 객체지향 디자인 패턴 중 하나다.공통된 구조를 가진 코드를 부모 클래스에서 정의하고, 세부 구현은 자식 클래스에서 따로 처리하게 만드는 방식.이렇게 하면 동일한 구조의 껍데기를 반복해서 쓰지 않아도 돼서 코드가 깔끔해진다. 📘 예시 코드로 이해해보자예를 들어, 게임 캐릭터가 공격하는 과정을 생각해보자. 모든 캐릭터는 "준비 -> 공격 -> 마무리"라는 공통 흐름을 가지는데, 구체적인 공격 방식은 캐릭터마다 다르다. 이걸 템플릿 메서드 패턴으로 구현하면:// 부모 클래스abstract class Character { // 템플릿 메서드: 공통 흐름 정의 public void attack() { System.out.println("캐릭터.. Design Pattern 2025. 3. 24. [디자인 패턴] Builder 패턴 빌더 패턴이 생성자보다 좋은 이유객체를 만들 때 빌더 패턴이 왜 기존 생성자 방식보다 나은지 궁금하다.1. 기존 생성자 방식, 뭐가 문제일까일단 생성자 방식은 객체를 만들 때 필요한 값을 전부 한 번에 넘겨야 한다. 예를 들어, 유저 정보를 담는 클래스를 만들어보자:// 기존 생성자 방식public class User { private String name; private int age; private String email; private String phone; private String address; private boolean isActive; public User(String name, int age, String email, String phone, St.. Design Pattern 2025. 3. 23. [Java 기초] 내부클래스에 static을 붙이는 이유 Java 내부 클래스에 static을 붙이는 이유Java에서는 클래스 안에 또 다른 클래스를 정의할 수 있는데, 이를 내부 클래스 (Nested Class)라고 한다.그리고 내부 클래스 중에서 static 키워드를 붙일 수 있는 경우가 있는데,이번 글에서는 왜 내부 클래스에 static을 붙이는지를 쉽게 설명하겠다.✅ 내부 클래스란?클래스 내부에 정의된 클래스다. 예를 들어:public class Outer { class Inner { // 일반 내부 클래스 } static class StaticInner { // static 내부 클래스 }}✅ 그럼 static은 왜 붙일까?내부 클래스에 static을 붙이면 외부 클래스의 인스턴스 없이도 내부 클래스를 생.. Java 2025. 3. 22. 이전 1 2 3 4 5 다음