Java 18

[Java & SpringBoot] Spring Boot + MyBatis 동작 원리 — @MapperScan과 namespace가 연결되는 방법

Spring Boot와 MyBatis를 연동할 때, DAO 인터페이스에는 구현체가 없는데도 메서드를 호출하면 SQL이 실행된다. 이 글에서는 그 연결이 언제, 어떻게 체결되는지를 설정 파일부터 요청 흐름까지 끝까지 추적한다. 구현체도 없는 인터페이스가 왜 동작하는가JDBC로 게시글 목록을 가져오는 코드를 먼저 보자.Connection conn = DriverManager.getConnection(url, user, pw);PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM post");ResultSet rs = pstmt.executeQuery();List list = new ArrayList();while (rs.next()) { Pos..

Dev Study/Backend 2026.05.25

[Java & SpringBoot] Filter vs Interceptor 요청 흐름 위치 차이와 로그인 인터셉터 실전 구현

컨트롤러마다 로그인 확인 코드를 붙이던 시절Spring Filter와 Interceptor를 이해하면 컨트롤러에서 반복되는 인증 코드를 제거할 수 있다. 요청이 컨트롤러에 닿기 전에 가로채서 처리하는 두 가지 메커니즘의 차이와 실전 활용법을 정리한다.로그인이 필요한 페이지가 늘어날수록 아래 코드가 컨트롤러마다 반복된다.@GetMapping("/mypage")public String mypage(HttpSession session) { if (session.getAttribute("loginUser") == null) { return "redirect:/login"; } return "mypage";}@GetMapping("/orders")public String orders(..

Dev Study/Backend 2026.05.24

[Java & SpringBoot]AOP 완전 정리 — 프록시 패턴, @Aspect, @Around, Pointcut 범위 설정

모든 메서드가 공유하는 코드 — 중복의 시작AOP(관점지향 프로그래밍)와 횡단 관심사(Cross-cutting Concern)를 이해하려면, 먼저 중복이 어디서 시작되는지 봐야 한다. 아래 두 클래스를 비교해보자.// Bad Code: 핵심 로직 한 줄을 위해 나머지가 전부 중복public class Engineer { public void execute() { System.out.println("장비를 준비한다."); // 중복 try { System.out.println("열심히 작업한다."); // 핵심 로직 System.out.println("결과를 커밋한다."); // 중복 } catch (TaskExcepti..

Dev Study/Backend 2026.05.24

[Java & SpringBoot] DI 의존성 주입 정리 — XML, Annotation, JavaConfig 비교 및 생성자 주입 권장 이유

new 한 줄이 만드는 함정: 강한 결합도의존성 주입(DI)과 제어의 역전(IoC)을 이해하려면, 먼저 잘못된 코드에서 출발해야 한다. 아래 코드에서 Developer는 작업할 장비가 필요하다. 그래서 스스로 만든다.// Bad Code: 강한 결합도 — Developer가 DesktopPC를 직접 만든다public class Developer { private DesktopPC pc; public Developer() { this.pc = new DesktopPC(); // 직접 생성 } public void develop() { System.out.println(pc.getSpec() + "으로 작업 시작"); }}문제는 new DesktopPC()..

Dev Study/Backend 2026.05.24

[Java & BackEnd] Forward와 redirect의 차이, Web의 기억력 Cookie & Session

도입: 웹은 당신을 기억하지 못한다우리가 매일 사용하는 웹 브라우저는 HTTP 프로토콜을 기반으로 통신한다. HTTP의 가장 치명적인 특징은 무상태(Stateless)라는 점이다. 서버는 클라이언트가 요청을 보낼 때만 응답할 뿐, 응답이 끝나면 클라이언트를 매몰차게 잊어버린다.만약 무상태 그대로 웹을 운영한다면, 사용자는 페이지를 이동할 때마다 매번 아이디와 비밀번호를 입력해야만 한다. 이 기억 상실증을 치료하기 위해 웹 개발자들은 '상태 유지 기술'을 만들어냈는데, 그 핵심이 바로 Cookie, Session, 그리고 Scope 메커니즘이다.Insight: 무상태(Stateless)는 서버의 부하를 줄여주는 훌륭한 특성이지만, 비즈니스를 영위하기 위해서는 반드시 상태를 강제로 기억하게 만드는 추가적인 ..

Dev Study/Backend 2026.04.25

[Java & BackEnd] 서블릿만 안쓰고 JSP가 등장해야했던 이유

HTML이라는 도화지: 웹 페이지의 뼈대를 이해하다서블릿(Servlet)과 JSP를 본격적으로 다루기 전에, 이 두 기술이 최종적으로 만들어내는 결과물인 HTML의 기본 구조부터 짚고 넘어가야 한다. 웹 브라우저는 서버로부터 HTML 문서를 받아 위에서 아래로 읽으며 화면을 그린다.가장 기본적인 HTML 문서의 뼈대는 다음과 같다. 본문 영역 브라우저에 실제로 보이는 내용은 여기에 작성한다.은 "이 문서는 HTML5 표준이다"라는 선언이다. Servlet 실습 로그인 폼 회원가입 폼 구구단 계산기 실습 프로젝트에서 index.html은 각 실습 페이지로 이동할 수 있는 네비게이션 허브(대문) 역할을 한다. 태그로 다른 HTML이나 JS..

Dev Study/Backend 2026.04.25

[JAVA & Antigravity] Exception 예외 정리: Try-catch, throws, Exception 커스텀

자바 프로그래밍에서 예외(Exception)는 피해야 할 대상이 아니라, 프로그램이 맞닥뜨린 '정상적이지 않은 상황'에 대한 가장 명확한 소통 방식입니다.흔히 에러가 발생하면 무조건 피하거나 덮어두려는 경향이 있지만, 이는 오히려 시스템의 안정성을 해치는 가장 큰 폭탄을 안고 가는 것과 같습니다.이 글에서는 예외의 통제권이 어떻게 이동하는지와, 개발자가 예외를 대하는 올바른 설계적 고찰에 대해 정리합니다.1. Bad Code: 예외를 삼키는 침묵의 암살자가장 치명적인 설계 결함은 에러가 발생했음에도 불구하고, 이를 아무렇지 않게 넘겨버리는 코드입니다.이러한 패턴을 '예외 먹어버리기(Swallowing Exception)'라고 부르며, 추후 버그의 원인을 찾을 수 없게 만듭니다.// Bad Code: 예외..

Dev Study/Java 2026.03.07

Java ArrayList와 HashMap 완벽 정리: VS Code 디버깅으로 보는 내부 동작

Java로 실무 비즈니스 로직을 다루다 보면, 데이터의 개수가 가변적인 상황을 필연적으로 마주하게 된다. 배열(Array)처럼 고정된 크기의 그릇으로는 사용자 수나 주문량이 폭증하는 동적인 환경에 유연하게 대처하기 어렵다.오늘은 Java Collections Framework가 어떻게 이 '크기의 제약'을 우아하게 해결하는지, 그리고 실무에서 가장 빈번하게 쓰이는 ArrayList와 HashMap의 내부 동작 원리를 파헤쳐 본다. Environment: Windows 11, JDK 21, VS Code, Antigravity1. 고정된 크기가 불러오는 재앙 (Bad Code)신입 개발자가 흔히 저지르는 실수 중 하나는 "학생 수는 대략 30명이니까 30개짜리 배열을 만들면 되겠지?"라고 단정 짓는 것이다..

Dev Study/Java 2026.02.09

[JAVA & Antigravity] 인터페이스: 강한 결합을 끊고 유연함을 얻다

개발을 하다 보면 "나중에 이 모듈이 바뀔 수도 있다"는 불안감을 마주한다. 특정 기술이나 라이브러리에 의존하는 코드를 작성했다가, 요구사항 변경으로 인해 코드 전체를 뒤엎어야 했던 경험은 누구에게나 있다. 이 문제를 해결하기 위해 자바는 인터페이스라는 강력한 규격 시스템을 제공한다. 인터페이스가 해결하려는 문제와 그 진화 과정, 그리고 다형성을 통한 설계의 유연성에 대해 정리한다.1. 문제 상황: 구체적인 것에 의존하다온라인 쇼핑몰의 결제 시스템을 개발한다고 가정한다. 초기 요구사항은 '신용카드' 결제만 지원하는 것이었다. 개발자는 별다른 고민 없이 CreditCard 클래스를 만들고, 주문 로직에서 이를 직접 가져다 썼다.// 구체 클래스public class CreditCard { public..

Dev Study/Java 2026.02.05

[Java] 제네릭의 역설: 유연할수록 아무것도 담을 수 없다

Java 제네릭: "이 바구니에는 사과를 담을 수 없습니다"1. 들어가며자바 제네릭을 공부하다 보면 가장 당혹스러운 순간이 찾아옵니다. "분명히 과일 바구니라고 선언했는데, 왜 사과를 못 담게 하지?"이 글은 ? extends T라는 외계어 같은 문법 뒤에 숨겨진, 자바 컴파일러의 "안전 과민증"에 대한 이야기입니다.2. 환경IDE: VS CodeJDK: Java 17Phase 1. 상식의 배신 (왜 사과 바구니는 과일 바구니가 아닐까?)현실 세계에서 "사과는 과일이다"는 참입니다. 그래서 친구가 "과일 좀 담아올 바구니 줘"라고 했을 때, 집에 있던 "사과 바구니"를 줘도 아무 문제가 없습니다. 어쨌든 과일을 담을 수 있으니까요.하지만 자바는 아주 고지식합니다. 자바에게 사과 바구니(List)와 과일 ..

Dev Study/Java 2026.01.28