TIL 12

Spring MVC의 ArgumentResolver 등록하고 사용하기

1. ArgumentResolver란?Argument = 메서드의 매개변수Resolver = 해결해주는 객체ArgumentResolver는 Spring MVC가 컨트롤러 메서드를 호출할 때 필요한 매개변수(Argument)를 어떻게 만들어서 넣어줄지 결정하는 역할을 한다. @GetMapping("/users/{userId}")public UserResponse getUser(@PathVariable Long userId) { ...}Spring MVC는 요청 URL에 있는 userId 값을 가져와서 메서드의 Long userId 파라미터에 넣어준다. @PostMapping("/users")public void createUser(@RequestBody SignupRequest request) { ..

TIL 2026.07.27

Java Enum 활용하기 - 계산기 과제로 이해하는 Enum

계산기 과제를 복습하면서 사칙연산 기호를 관리하기 위해 Enum을 사용해보았다.처음에는 단순히 +, -, *, /를 switch문에서 직접 비교했지만, 도전 과제에서는 Enum을 활용하여 연산자 정보를 하나의 타입으로 관리해보았다.이번 글에서는 계산기 과제에서 사용한 코드를 기준으로 Java의 Enum을 어떻게 활용할 수 있는지 정리해보자.1. Enum이란?Enum은 서로 관련된 상수들을 하나의 타입으로 묶어서 관리할 수 있도록 해주는 문법이다.이 값들은 프로그램이 실행되는 동안 갑자기 다른 연산자로 변경될 필요가 없다.이처럼 정해진 값들을 하나의 그룹으로 관리하고 싶을 때 Enum을 사용할 수 있다. 계산기 과제에서는 OperatorType이라는 Enum을 만들었다.public enum Operator..

TIL 2026.07.24

싱글톤(Singleton) 패턴이란?

1. 싱글톤이란?싱글톤(Singleton)은 특정 클래스의 인스턴스를 프로그램 전체에서 단 하나만 생성되도록 보장하는 디자인 패턴이다. 일반적으로 객체를 생성하면 new를 사용할 때마다 새로운 인스턴스가 만들어진다.MyClass a = new MyClass();MyClass b = new MyClass();이 경우 a와 b는 서로 다른 객체이다.하지만 싱글톤으로 설계된 클래스는 여러 곳에서 사용하더라도 하나의 인스턴스만 공유해서 사용한다. 2. 싱글톤은 어디에 사용할까?싱글톤은 애플리케이션 전체에서 하나만 존재해도 되는 객체에 사용할 수 있다.대표적인 예시는 다음과 같다. ① 설정(Configuration) 객체프로그램 전체에서 공통으로 사용하는 설정 정보를 관리하는 객체이다.애플리케이션 ├─ A 기..

TIL 2026.07.23

JPA N+1 문제란? (왜 생기고 어떻게 해결할까?)

프로젝트를 진행하면서 코드 리뷰에서 "N+1 문제가 발생할 수 있다." 라는 피드백을 받았다.처음에는 이름만 들어서는 감이 오지 않았다. "도대체 왜 조회가 100번씩 일어난다는 거지?"그래서 이번 기회에 N+1 문제가 무엇인지, 왜 발생하는지, 어떻게 해결하는지 정리해보았다.N+1 문제란?N+1 문제는데이터를 조회할 때 처음 조회하는 쿼리(1번) 이후에 연관된 데이터를 가져오기 위해 N번의 추가 쿼리가 발생하는 현상이다.예를 들어 Customer와 Order가 있다고 생각해보자.Customer └── Order (1:N) 고객 목록을 조회하는 상황이다.List customers = customerRepository.findAll(); 여기까지는 SQL이 딱 한 번 실행된다.SELECT * FROM c..

TIL 2026.07.15

[트러블슈팅] 고객 조회 시 주문 통계(총 주문 수 / 총 구매 금액) 추가하기

1. 문제 상황요구사항기존 고객 조회 API에 다음 정보를 추가해야 했다.총 주문 수총 구매 금액2. 처음 구현한 방법처음에는 OrderRepository에 메서드를 만들었다.countByCustomerId(customerId)sumTotalPriceByCustomerId(customerId) 그리고 CustomerService에서orderRepository.countByCustomerId(customer.getId());orderRepository.sumTotalPriceByCustomerId(customer.getId()); 를 호출하여 응답 DTO에 담았다.장점구현이 간단하다.이해하기 쉽다.3. 고민했던 부분하지만 고객 목록 조회에서는고객이 100명이라면? 고객마다count()sum() 를 각각 ..

TIL 2026.07.14

[Spring] MVC에서 자주 사용하는 객체와 어노테이션 정리

로그인 기능을 구현하면서 HttpServletRequest, HttpSession, @RequestHeader, @SessionAttribute가 자주 등장한다. 이름도 비슷하고 역할도 헷갈리기 쉬워서 각각의 역할을 정리해보았다. 1. HttpServletRequest무엇인가?클라이언트(브라우저)가 서버로 보낸 HTTP 요청 전체를 담고 있는 객체이다.쉽게 말하면, "사용자가 서버에게 보낸 모든 정보가 들어있는 상자" 라고 생각하면 된다. 예를 들어 사용자가POST /login을 요청했다면,요청 URL요청 방식(GET, POST)요청 헤더쿠키세션Body(JSON)등 모든 정보를 HttpServletRequest가 가지고 있다.사용할 수 있는 예시request.getParameter(...)request...

TIL 2026.07.08

Java 리스트(List) 활용 & 반복문 리팩토링

1. 기본 구조 - List 사용먼저 상품들을 관리하기 위해 List를 사용함.List products = new ArrayList();Product product1 = new Product("Galaxy S25", 1200000, "최신 안드로이드 스마트폰", 10);Product product2 = new Product("iPhone 16", 1350000, "Apple의 최신 스마트폰", 10);products.add(product1);products.add(product2); 2. 향상된 for문으로 출력하기처음에는 향상된 for문을 사용해서 데이터를 출력함for (Product item : products) { System.out.println( item.getProductNa..

TIL 2026.06.23

람다(Lambda)와 스트림(Stream) 간단 정리

람다(Lambda)람다는 메서드를 간결하게 표현하는 문법이다. 익명 클래스를 사용하는 것보다 코드가 훨씬 짧고 읽기 쉬워진다.예를 들어 Comparator를 구현할 때 별도의 클래스를 만들지 않고 람다식을 사용해 간단하게 작성할 수 있다.느낀 점코드가 훨씬 간결해졌다.처음에는 문법이 낯설었지만, "메서드를 한 줄로 표현하는 방식"이라고 생각하니 이해하기 쉬웠다.스트림(Stream)스트림은 컬렉션(List 등)의 데이터를 반복하면서 가공하거나 원하는 결과를 얻기 위한 기능이다.대표적으로 다음과 같은 작업을 간결하게 처리할 수 있다.filter() : 원하는 조건의 데이터만 선택map() : 데이터를 다른 형태로 변환forEach() : 각 요소를 순회하며 작업 수행collect() : 결과를 새로운 컬렉션..

TIL 2026.06.22

Java - Enum으로 문자열 입력값과 연산자를 매칭하기

문제 상황계산기 만드는 과제중 연산 기호는 enum으로 처리하도록 코드를 짜보았다.enum 이론만 알고, 실제로 코드 구현은 처음이라 많이 해맸음. 내 자바인생 첫 enum 코드 ㅋㅋ이거면 된거 아니가?? 라고 생각했음 각 연산기호 상수를 만들고 인자에다가 입력값과 동일한 문자열을 넣어줌.사실 여기까지 이해하는데도 좀 오래 걸림;;public enum OperatorType { ADD("+"), SUBTRACT("-"), MULTIPLY("*"), DIVIDE("/"); private String operator; OperatorType(String operator) { this.operator = operator; } public String ..

TIL 2026.06.19

TIL - 코드 리팩토링 (중복된 코드 메서드로 만들기)

오늘 계산기 과제를 하면서지난번에 내가 짠 코드를 보니 중복된 부분이 있어서,이걸 좀 중복안되게 할 순 없을까? 라는 고민을 하게 되었다. 튜터님께 물어보니 중복된 코드들을 하나의 메서드로 만들면 어떠냐고 해서 하나의 메서드로 만들어 보았다. 기존 코드try { System.out.print("첫번째 숫자를 입력하세요: "); num1 = sc.nextInt(); sc.nextLine(); if (num1 여기에서 숫자입력 받는 부분들이 중복이 많았고, 뭔가 되게 보기가 싫었음그래서 입력받는 메서드를 만듦. 초기 메서드 코드,,,ㅋㅋstatic int input(String notice, int..

TIL 2026.06.18