Java 18

[Java] Mockito

1. Mock: “완전한 가짜, 기본값만 돌려줌”개념실제 로직이 전혀 없는 가짜 객체입니다.메서드를 호출해도 기본값(null, 0, false 등)만 반환하고, 아무 일도 안 합니다.테스트에서 “이 메서드가 이렇게 호출됐는지” 같은 행위(호출 여부, 횟수)를 검증할 때 많이 씁니다.List list = Mockito.mock(List.class);// 실제로는 리스트에 아무것도 안 들어감list.add("a");assertEquals(0, list.size()); // 사이즈는 0 (진짜 add 안 됨)verify(list).add("a"); // add("a")가 불렸는지만 확인 언제 Mock을 쓰냐?테스트 대상 코드가 의존성(Repository, 외부 API,..

Java 2026.02.01

[Java] 입력값 검증의 범위와 책임

애플리케이션의 입력값 검증의 범위와 책임을 어떻게 나눌 것인가?1. Presentation 계층 (@Controller + @Valid)사용자 입력의 형식, 필수값 여부, 문자열 길이 등 기본적인 유효성 검증을 수행합니다.목적은 빠른 피드백과 사용자 경험 향상입니다.@Valid와 Bean Validation 어노테이션을 사용하여 구문적 검증(Syntactic Validation)을 수행합니다.public class UserRegistrationRequest { @NotBlank(message = "아이디는 필수 입력값입니다.") @Size(min = 4, max = 20, message = "아이디는 4~20자 사이여야 합니다.") private String username; @Em..

Java 2026.02.01

[Java] 모니터링 - Prometheus와 Grafana

1. 모니터링나무위키: 어떠한 대상의 상태를 주의깊게 관찰, 주시를 한다는 의미로 쓰이며, 다양한 분야에서 고유한 뉘앙스로 활용되는 어휘다.애플리케이션을 안정적으로 운영하기 위해서는 서버의 건강 상태와 비정상 징후를 실시간으로 체크해야 한다.모니터링이 부재할 경우 서비스 장애 대응이 늦어지고 사용자 경험이 저하될 수 있다.주요 모니터링 대상 (예시)비즈니스 오류: 잘못된 입력값 유입 및 비정상적인 데이터 흐름 탐지.애플리케이션 예외: 예상치 못한 Runtime Exception 및 에러 로그 발생 모니터링.시스템 리소스: CPU 사용량, 메모리(Heap) 점유율, 디스크 I/O, 네트워크 트래픽 등.인프라 및 연동: 외부 API 호출 지연, 데이터베이스(DB) 연결 상태 및 커넥션 풀 확인.2. 모니터링..

Java 2026.02.01

[Java] ORM의 N+1 문제

📝 N+1 구현 자료 GitHub GitHub - castle-bird/castle-bird-lab: 마주한 이슈들을 해결하고 기록하는 곳마주한 이슈들을 해결하고 기록하는 곳. Contribute to castle-bird/castle-bird-lab development by creating an account on GitHub.github.com 1. N+1이란?JPA와 같은 ORM(객체 관계 매핑) 기술에서 발생하는 성능 문제하나의 쿼리(1)를 실행했을 때 연관된 객체를 불러오기 위해 N개의 추가 쿼리가 반복적으로 실행데이터베이스 부하와 성능 저하를 야기 ⭐@ManyToOne(fetch = FetchType.LAZY)의 게으른 로딩시 문제가 발생.2. N+1의 원인 및 코드연관된 엔티티를 불러올 ..

Java 2026.01.13

[Java] @RestController와 HttpMassageConverter

1. @RestController란?@Controller + @ResponseBody를 합친 어노테이션으로, JSON API 개발에 최적화되어 있습니다. 1-1. 만들어진 이유기존 방식의 문제점(코드 중복)@Controller // View(JSP, Thymeleaf) 반환용@ResponseBody // JSON 반환용 ← 매번 붙여야 함 ❌@GetMapping("/api/users")public List getUsers() { return userService.findAll();} @RestController로 중복코드 해결@RestController // = @Controller + @ResponseBody ✅@GetMapping("/api/users")public List getUsers..

Java 2026.01.04

[Java] @Controller 와 @RestController

1. @Controller란?@Controller는 전통적인 Spring MVC에서 화면(UI)을 반환하기 위한 컨트롤러이다.핸들러 메서드는 보통 String(뷰 이름)를 반환하고, 이 때 함께 전달한 Model 데이터는 ViewResolver가 찾은 뷰 템플릿(Thymeleaf, JSP, 등)에 렌더링되어 HTML 화면으로 응답된다.@Controllerpublic class HomeController { @GetMapping("/home") public String home(Model model) { model.addAttribute("name", "user"); return "home"; // 뷰 이름 }}반환값: 뷰 이름용도: 서버 사이드 렌더링(SSR)..

Java 2025.12.26

[Java] AOP

1. AOP란?AOP(Aspect Oriented Programming = 관점 지향 프로그래밍)는 기능을 '핵심 로직'과 '공통 기능'으로 분리하여 관리하는 프로그래밍 패러다임입니다. '관점'이라는 추상적인 단어는 실무적으로 다음과 같이 이해할 수 있습니다. Aspect(관점 → 공통 관심사): 여러 모듈에서 공통적으로 필요로 하는 부가 기능 그 자체를 의미합니다.(예: 로깅, 보안 검사, 트랜잭션 관리) 핵심 관점(Primary Concern): 로그인, 검색, 게시판 서비스는 개별 구분이 되어 있고 비즈니스의 본질적인 기능을 담당하는 영역입니다. 상 → 하로 실행되는 독립적인 수직 구조를 가집니다.횡단 관점(Cross-cutting Concern): 로깅(Logging), 보안(Security),..

Java 2025.12.24

[Java] Spring Boot에서 Bean 등록하는 법

1. @CompoentScan + @Component스프링이 정해진 패키지를 스캔하며 @Component 어노테이션이 붙은 클래스를 찾아 자동으로 Bean으로 등록하는 방식입니다.1-1. 작동 방식@SpringBootApplication 어노테이션 안에 포함된 @ComponentScan이 실행되면서, 해당 패키지 하위의 모든 @Component 계열(@Service, @Repository, @Controller 등) 클래스를 찾아 Bean인스턴스를 생성합니다.이 때 @ComponentScan이 @Component를 찾는 패키지의 기준은 @SpringBootApplication가 붙어있는 메인 클래스가 있는 패키지가 기준이된다.1-2.주요 사용처우리가 직접 작성하는 대부분의 비즈니스 로직 클래스(Servi..

Java 2025.12.21

[Java] 웹 서버와 WAS

1. 서버(Server)란?서버(server)는 컴퓨터 망에서 "클라이언트"라고 불리는 다른 컴퓨터에 정보를 제공하는 컴퓨터이다.데이터센터의 컴퓨터들을 예시로 들 수 있다.출처: 위키백과서버는 종류가 많은데 웹 개발에서는 어떤 정보를 제공하는지에 따라 웹 서버와 WAS로 나눌 수 있다.2. 웹 서버(Web Server)란?웹 서버는 클라이언트(Client = 서비스를 요청하는 사용자/브라우저)로부터 HTTP(HyperText Transfer Protocol = 하이퍼텍스트 전송 규약) 요청을 받아, 주로 정적(Static) 자원을 제공하는 역할을 수행하는 서버입니다. static의 사전의미(변화·움직임이 없이) 고정된[고정적인]정지 상태의출처: 네이버 영어사전 2-1. 대표적인 정적 자원문서 및 구조: ..

Java 2025.12.19

[Java] CORS와 CSRF의 차이

CORS와 CSRF 정리웹 보안에서 자주 함께 언급되는 개념이 CORS와 CSRF이다.둘 다 “쿠키”와 “브라우저”에서 출발하지만, 막으려는 문제와 차단 지점은 완전히 다르다.핵심부터 정리하면 다음과 같다.CORS는 ‘응답을 읽을 수 있느냐’의 문제고,CSRF는 ‘요청을 실행해도 되느냐’의 문제다. CORS란? https://www.mySite.com:443/mypage?id=1&name=honggildong현재 위의 TEST주소를 분해하면 아래와 같다.protocol (scheme)httpshostnamemySite.comport443 (https 기본 포트)pathname (path)/mypagesearch (query string)?id=1&name=honggildongorigin protocol ..

Java 2025.12.14