
이번 정리는 Backend 영역에서 사용하는 Build System과 Spring Boot의 기본 구조를 정리한 내용이다. Java 초반 수업에서 설정했던 Build System이 왜 필요한지, 그리고 Spring Boot와 어떤 관계가 있는지를 중심으로 정리한다

이번 정리는 Backend / OOP logic in Java 관점에서 DI가 왜 필요한지, 순수 Java → Spring Boot로 어떻게 확장되는지를 흐름 중심으로 정리한다. 1. 의존성이란 무엇인가 A 클래스가 B 클래스를 내부에서 생성하거나 사용하면,

이 내용은 Spring Boot 백엔드에서 Persistence Layer(DB 접근 계층)에 해당한다. 프론트(HTML/JS/React)가 API로 요청하면, 백엔드(Spring Boot)가 Service/Repository를 통해 DB에 접근하고, JPA가 SQL

이 내용은 Backend(Controller/API Layer)에 해당한다. Frontend(브라우저/React/모바일 앱)는 HTTP로 API를 호출하고, Spring Boot는 Controller에서 요청을 받아 Service/Repository로 넘긴 뒤 D

1) 왜 “API 명세서”가 필수인가 RESTful API는 “요청을 어떻게 보내면, 어떤 응답이 오는지”가 규칙으로 정리되어 있어야 프론트/다른 서버/외부 개발자가 안전하게 사용할 수 있다. 명세서에는 보통 아래가 들어간다. Endpoint 목록 (URL,

이번 단계는 “백엔드 보안”을 실제로 적용해보는 구간이다. 단순히 로그인 화면이 뜨는 걸로 끝이 아니라, Spring Data REST 때문에 자동 생성되는 엔드포인트까지 포함해서 “어디가 열리고 어디가 막히는지”를 개발자가 통제해야 한다. 특히 /api/appU
기본 인증(Basic Auth)은 요청할 때마다 username/password가 함께 전송되는 구조라서 보안적으로 불리하고, 프론트(React)에서 “로그인 → 토큰 저장 → 이후 요청에 토큰 첨부” 같은 흐름을 만들기에도 적합하지 않다. 그래서 REST API

SpringBoot에서 3-Tier Architecture는 유지보수성과 확장성을 높이기 위한 표준 설계 방식이다. 각 계층은 “자기 책임만” 수행하며, 계층 간 데이터 이동은 Entity가 아닌 DTO를 통해 이루어진다. 이번 정리는 TodoList 예제를 기준
1. 개념 소개 Spring Boot로 백엔드 개발을 시작하면 @RestController, @GetMapping 같은 애노테이션만 쓰면 API가 뚝딱 만들어진다. 근데 내부적으로 HTTP 요청이 어떻게 처리되는지 궁금하지 않았나? 그 밑바닥에 있는 게 바로 Servlet(서블릿)이다. Servlet은 Java에서 HTTP 요청을 처리하고 응답을 돌려주...
1. 개념 소개 Spring Boot로 API를 만들 때 @RestController에 메서드 하나 쓰면 바로 동작한다. 근데 클라이언트가 GET /api/users를 보냈을 때, 그 요청이 내 메서드까지 어떻게 도달하는 걸까? 그 과정을 설명하는 게 바로 Spring MVC 요청 흐름이다. Spring MVC는 Model-View-Controller ...
1. 개념 소개 Spring Boot로 API를 만들 때 우리는 @RestController에 메서드만 작성하면 된다. 그런데 HTTP 요청이 들어왔을 때 "이 요청은 저 Controller 메서드가 처리해"라고 누가 결정해주는 걸까? 그 역할을 하는 게 바로 D
1. 개념 소개 Spring Boot로 API를 만들다 보면 이런 생각이 든다. "로그인 여부 확인, 로깅, CORS 처리... 이걸 Controller마다 넣기엔 너무 반복인데?" 그 고민을 해결해주는 게 Filter(필터)다. Filter는 HTTP 요청과 응답을 DispatcherServlet에 도달하기 전후로 가로채서 공통 처리를 할 수 있는 ...
1. 개념 소개 Filter를 공부하다 보면 자연스럽게 이런 의문이 생긴다. "Filter랑 비슷한 역할 같은데, Interceptor는 왜 따로 있는 거지?" Interceptor(인터셉터)는 DispatcherServlet이 Controller를 실행하기 전후에 요청을 가로채서 공통 처리를 할 수 있는 컴포넌트다. org.springframework...
1. 개념 소개 Spring Security로 로그인 기능을 구현하다 보면 이런 코드를 마주치게 된다. 이게 뭘 하는 코드인지, 왜 이렇게 꺼내야 하는지 처음엔 감이 잘 안 온다. SecurityContext는 현재 요청을 처리하는 스레드에서 인증된 사용자 정보를 보관하는 저장소다. 로그인에 성공하면 사용자 정보가 이 SecurityContext에 담...
1. 개념 소개 백엔드 개발을 하다 보면 데이터베이스와 Java 코드 사이에 항상 벽이 하나 있다. DB는 테이블과 행(Row)으로 데이터를 다루고, Java는 클래스와 객체로 데이터를 다룬다. 이 두 세계는 구조 자체가 다르다. ORM(Object-Relational Mapping)은 이 두 세계 사이의 간극을 채워주는 기술이다. Java 객체와 DB...
1. 개념 소개 ORM이 필요한 이유를 이해했다면, 이제 JPA가 실제로 어떻게 동작하는지 들여다볼 차례다. userRepository.save(user) 한 줄을 호출했을 때 내부에서 무슨 일이 벌어지는지, 왜 save()를 안 불렀는데도 UPDATE가 나가는지, 같은 ID로 두 번 조회했는데 쿼리가 한 번만 나가는 이유가 뭔지. 이 모든 답이 JPA...
1. 개념 소개 JPA 동작 원리를 공부하다 보면 반드시 마주치는 개념이 있다. 영속성 컨텍스트(Persistence Context)다. JPA가 제공하는 여러 편의 기능들 — 변경 감지, 1차 캐시, 쓰기 지연 — 이것들이 전부 영속성 컨텍스트 안에서 작동한다. 이 개념을 모르면 JPA가 마법처럼 느껴지고, 알고 나면 왜 그렇게 동작하는지 전부 설명이...
1. 개념 소개 Spring Boot 코드를 보다 보면 Service 메서드에 거의 항상 @Transactional이 붙어있다. "그냥 붙이는 거 아닌가?"라고 생각하고 넘어가기 쉬운데, 이게 없으면 어떤 일이 생기는지 알면 왜 필요한지 명확하게 이해된다. 트랜잭션(Transaction)은 여러 DB 작업을 하나의 논리적 단위로 묶는 것이다. 묶인 작업...
1. 개념 소개 JPA를 쓰다 보면 어느 순간 콘솔에 쿼리가 이상하게 많이 찍히는 걸 보게 된다. 분명히 목록 조회 하나를 했는데 쿼리가 수십 개가 나간다. 이게 바로 N+1 문제다. N+1 문제란 1번의 쿼리로 N개의 데이터를 조회한 뒤, 각 데이터의 연관 엔티티를 가져오기 위해 N번의 쿼리가 추가로 발생하는 현상이다. 결과적으로 1 + N번의 쿼리...
1. 개념 소개 JPA로 엔티티를 조회할 때 연관된 엔티티를 언제 가져오느냐에 대한 전략이 두 가지 있다. 즉시 로딩 (Eager Loading) — 엔티티를 조회할 때 연관 엔티티를 즉시 함께 조회한다 지연 로딩 (Lazy Loading) — 연관 엔티티가 실제로 사용되는 시점에 그때서야 조회한다 JPA에서는 @ManyToOne, @OneTo...
1. 개념 소개 Spring Security를 공부하다 보면 Authentication, Authorization이라는 단어가 계속 나온다. 한글로 옮기면 둘 다 "인증"처럼 보이는데, 사실은 완전히 다른 개념이다. 인증(Authentication)은 "이 사용자가 누구인가"를 확인하는 과정이다. 로그인이 대표적인 인증 과정이다. 아이디와 비밀번호, 또...
1. 개념 소개 인증과 인가를 공부했다면, 이제 실제로 "어떻게 인증 상태를 유지하느냐"를 봐야 한다. HTTP는 stateless라서 매 요청마다 "당신이 누구인지"를 매번 증명해야 한다. 이걸 해결하는 대표적인 방식이 JWT(JSON Web Token)다. JWT는 사용자 정보를 담은 토큰을 클라이언트가 직접 들고 있다가, 매 요청마다 서버에 함께 ...
1. 개념 소개 "구글로 로그인", "카카오로 로그인" 버튼을 누르면 구글/카카오 화면으로 이동했다가 다시 우리 서비스로 돌아오면서 로그인이 완료된다. 이 흐름의 기반이 OAuth2다. OAuth2는 사용자가 비밀번호를 직접 우리 서비스에 입력하지 않고도, 신뢰할 수 있는 제3자(구글, 카카오 등)를 통해 인증/인가를 처리할 수 있게 하는 프로토콜이다....
1. 개념 소개 개발하다 보면 한 번쯽은 듣게 되는 말이 있다. "제 컴퓨터에서는 잘 되는데요?" Java 버전이 다르고, OS가 다르고, 설치된 라이브러리 버전이 달라서 같은 코드가 다른 환경에서는 제대로 동작하지 않는 경우가 많다. Docker는 애플리케이션과
1. 개념 소개 Docker란 무엇인지 공부하고 나면, 항상 같이 따라오는 두 단어가 있다. 이미지(Image)와 컨테이너(Container). 처음엔 둘 다 비슷한 말처럼 들리는데, 사실 명확하게 다른 개념이다. 가장 직관적인 비유는 Java의 클래스와 인스턴스다. 이미지 — 클래스(class). 어떻게 만들어질지 정의된 템플릿. 그 자체로는 실...
1. 개념 소개 Spring Boot 애플리케이션을 Docker로 띄우다 보면 곧 한계를 느낀다. 애플리케이션만 컨테이너로 띄워서는 동작하지 않는다. MySQL, Redis 같은 의존 서비스들도 컨테이너로 함께 띄워야 한다. 이걸 매번 docker run 명령을 여러 번 따로 입력해서 관리하면 포트, 네트워크, 환경변수, 실행 순서까지 신경 써야 할 게...
1. 개념 소개 로컬에서 Spring Boot 애플리케이션을 잘 만들었어도, 그게 인터넷 어디에선가 다른 사람도 접속할 수 있는 서버 위에서 돌아가야 진짜 서비스가 된다. 이때 등장하는 게 EC2와 Nginx다. EC2(Elastic Compute Cloud)는 AWS가 제공하는 가상 서버다. 물리적인 서버를 직접 사 와서 설치할 필요 없이, 필요한...
1. 개념 소개 백엔드 아키텍처를 공부하다 보면 거의 항상 등장하는 비교가 있다. 모놀리식(Monolithic)과 MSA(Microservice Architecture)다. 모놀리식 아키텍처는 하나의 애플리케이션 안에 모든 기능(회원, 주문, 결제, 상품 등)이 함께 들어있는 구조다. 하나의 코드베이스, 하나의 빌드 산출물(JAR), 하나의 배포 단위로...
1. 개념 소개 Monolith와 MSA를 비교하면서 Feign Client, Circuit Breaker 같은 단어들이 나왔는데, 이것들이 전부 Spring Cloud라는 하나의 생태계에 속한 도구들이다. Spring Cloud는 MSA 환경에서 흔히 마주치는 공통 문제들(서비스 탐색, 설정 관리, 서비스 간 통신, 장애 격리 등)을 Spring 방식...
1. 개념 소개 Spring Boot로 프로젝트를 만들다 보면 보통 이런 구조를 쓴다. Controller → Service → Repository. 이게 Layered Architecture(계층형 아키텍처)다. 간단하고 익숙하지만, 프로젝트가 커지면 한계가 보이기 시작한다. Hexagonal Architecture(헥사고날 아키텍처)는 이 문제를 다른...
1. 개념 소개 Docker로 컨테이너를 띄우고, Docker Compose로 여러 컨테이너를 함께 관리하는 것까지 해봤다면 자연스럽게 다음 질문이 생긴다. "서버가 한 대가 아니라 여러 대라면? 컨테이너가 죽으면 누가 다시 띄워주지? 트래픽이 몰리면 누가 자동으로
1. 개념 소개 MSA나 대규모 시스템을 설계하다 보면 이런 상황이 생긴다. "주문이 완료되면 → 결제 서비스에 알려야 하고 → 알림 서비스에도 알려야 하고 → 재고 서비스에도 알려야 한다." 이걸 직접 API 호출로 연결하면 서비스 간 결합도가 높아지고, 하나가 느려지면 전체가 느려진다. Apache Kafka는 이런 서비스 간 데이터 전달을 비동기적...
1. 개념 소개 백엔드 개발을 하다 보면 이런 작업이 필요해진다. "매일 자정에 지난달 구매 내역을 집계해서 월 정산을 만들어야 한다." "100만 건의 사용자 데이터를 읽어서 등급을 재산정해야 한다." "DB에 쌓인 오래된 로그 데이터를 정기적으로 아카이빙해야 한다." 이런 작업들의 공통점이 있다. 대용량 데이터를 읽어서 처리하고 저장하는 일을 정해진...
Spring WebFlux를 사용하면 반환 타입으로 일반 객체나 List 대신 Mono와 Flux를 자주 사용한다.처음에는 연산자 이름보다도 다음 부분이 가장 헷갈린다.map을 사용해야 하는지 flatMap을 사용해야 하는지연산자를 사용한 뒤 반환 타입이 Mono인지