Backend 145
- 캐시 추상화: @Cacheable은 어떻게 동작하고 어디서 터지나
- Spring Security 기초: 필터 체인으로 보는 인증과 인가
- 어떤 호출을 사용량으로 셀 것인가 — 미터링의 경계 정의
- 서드파티 클라이언트에 파라미터를 더할 때 응답까지 들여다보기
- 테스트 슬라이스: @WebMvcTest · @DataJpaTest · @SpringBootTest
- 개발에선 열고 운영에선 닫는다: 환경별 우회 필터의 위험
- 모든 쿼리에 스톱워치 달기: AOP 횡단 관심사
- 믿을 수 없는 메시지 — 컨슈머 입구에서 파싱하고 검증하기
- 필터 순서가 보안을 만든다: 인증 앞에 무엇을 둘까
- Spring Boot Actuator — 엔드포인트는 어떻게 만들어지고 노출되나
- 메시지를 안 띄우고 컨슈머를 테스트하는 법
- 메서드에 권한을 붙이다: @PreAuthorize는 어떻게 동작하나
- MyBatis 설정 한 줄이 쿼리 전체 동작을 바꾼다
- GraalVM 네이티브 이미지와 AOT
- Observability: Micrometer와 분산 추적
- 컨트롤러는 얇게, 서비스는 두껍게 — 비즈니스 로직의 올바른 위치
- 서버 간 호출을 API 키로 인증하는 필터
- 비밀번호 재설정 링크의 보안 설계 — 일회성·만료·추측 불가 토큰
- Spring Framework 7의 HTTP API 버저닝
- Jackson 직렬화: null·날짜·순환참조의 함정
- 선언적 HTTP 클라이언트: @HttpExchange와 RestClient
- 같은 유형을 두 번 등록 못 하게 — 중복 검사 자리
- 가상 스레드(Virtual Threads)와 Spring Boot
- 계층 간 매핑 코드를 줄이는 법
- record DTO와 검증 어노테이션을 제대로 쓰기
- 사업자·법인등록번호는 입력받기 전에 스스로 검증된다 — 체크섬 알고리즘
- 한 요청에 파일과 JSON을 함께 받는 법
- Spring Boot 4 · Spring Framework 7, 무엇이 바뀌었나
- 외부 연동 설정값이 비어 있을 때 — null 안전 기본값과 생성자 방어
- 외부 API의 HTTP 오류를 우리 언어로 번역하기 — 예외 변환 계층
- 요청 검증(Bean Validation): @Valid, @Validated, 커스텀 제약
- @Transactional 동작 원리와 자주 빠지는 함정
- Spring Data JPA 기본기: Repository와 쿼리 메서드
- Spring MVC vs WebFlux, 언제 무엇을 쓸까
- REST API 예외 처리: @RestControllerAdvice로 일관된 응답 만들기
- 짧은 토큰과 긴 토큰을 같이 쓰는 이유
- 공개 URL에 내부 ID를 그대로 노출하지 않기
- Starter와 의존성 관리(BOM): 버전 지옥에서 벗어나기
- 외부 설정 제대로 쓰기: PropertySource 우선순위 · @ConfigurationProperties · Profile
- @SpringBootApplication 한 줄 뜯어보기
- 짧은 시간 같은 요청을 한 번만 처리하기
- IoC 컨테이너와 의존성 주입(DI), 그리고 Bean 생명주기
- 세션 타임아웃과 자동 로그아웃 설계
- Spring Boot 자동 구성(Auto-configuration)은 어떻게 동작하나
- 로그인 시도를 무한히 허용하면 안 된다
- 엔드포인트마다 요청 DTO를 따로 두는 리팩토링
- 비밀번호는 암호화가 아니라 해싱이다
- 세션과 토큰, 무엇이 상태를 가지는가
- 한 덩어리로 자란 기능을 둘로 가르기
- 지금 누가 요청했는가를 어디서나 꺼내 쓰기 — SecurityContext와 현재 사용자
- 트랜잭션 안에서 외부 API를 부르면 안 되는 이유
- 한 덩어리로 지켜야 할 데이터의 경계
- 한 DB에서 여러 집단의 데이터를 가르는 법
- 신뢰 경계에서 모든 입력을 검문하라
- 에러 메시지가 공격자에게 주는 단서
- readOnly=true가 진짜로 하는 일
- 도로명과 지번을 갈라야 좌표가 잡힌다 — 주소 정규화
- 목표 대비 성과가 어긋나는 이유 — 집계 전 타입 일치
- 한 부모에 여러 자식: collection 매핑의 그룹핑
- 안 쓰는 변수가 코드를 붙들고 있을 때 — 결합된 죽은 코드 정리
- 읽기 경로와 쓰기 경로를 다르게 최적화하기
- 인터셉터로 권한 검사를 한 곳에 모으기
- 담당자만 옮길 수 있다 — 행 소유권 기반 인가
- 팀을 바꾸면 모든 쿼리가 따라 바뀌어야 한다 — 요청 컨텍스트 전파
- 인증과 인가를 한 줄도 섞지 마라
- PUT과 PATCH, 그리고 부분 수정의 진실
- 쿼리스트링·폼·바디: 파라미터 바인딩의 규칙
- 한 필드만 봐선 모르는 검증 규칙 — 클래스 레벨 상호 검증
- 오래 걸리는 작업에 즉시 응답하는 법 — 202 Accepted와 상태 폴링
- MyBatis: WHERE 1=1 대신 trim으로 해결하기
- #{} 와 ${}: 바인딩과 인젝션의 분기점
- 지웠던 기능을 되살려야 할 때 — 롤백의 기술
- 여러 조각을 순차로 불러올까 동시에 불러올까 — 화면 조립 로딩 전략
- 결제 상태는 함부로 건너뛰면 안 된다
- API를 바꿔야 할 때 망가뜨리지 않는 법
- 메뉴 단위 권한을 필터 체인으로 거는 법
- 방금 저장한 데이터가 안 보이는 이유
- 메뉴를 코드가 아니라 데이터로 그리기
- 메뉴를 지운다는 것 — 죽은 코드를 안전하게 걷어내기
- TypeHandler: enum과 컬럼 사이의 번역가
- 한 화면에서 고치면 다른 화면도 바뀌어야 한다 — 갱신 후 상태 동기화
- 셀 하나를 고치면 무엇이 저장되는가 — 인라인 편집의 갱신 계약
- ControllerAdvice로 예외를 한 곳에서
- MyBatis 1차·2차 캐시를 정확히 이해하기
- 스크롤을 내릴수록 따라오는 목록 — 무한 스크롤 서버 설계
- 같은 클래스 메서드 호출엔 트랜잭션이 안 걸린다
- 저장된 필터를 다시 열면 그대로여야 한다 — 필터 상태 영속화
- 페이지네이션 UI의 시작·끝 블록 계산을 서버가 책임지는 이유
- 외부 API를 갈아끼우는 설계 — 전략과 팩토리로 클라이언트 추상화하기
- URL은 동사가 아니라 명사다
- 에러를 분류해 코드로 말하게 하기
- 저장 전에 입력을 다듬는 정규화 계층
- 필요할 때 불러올까, 미리 불러올까
- 읽기와 쓰기 모델을 갈라 생각하기
- 검색 조건을 객체로 다루는 쿼리 빌더
- 필드 주입을 버리고 생성자 주입으로 가는 이유
- 이미 지운 걸 또 지우면 에러여야 할까
- 타이핑마다 날아오는 검색 요청을 다루는 법
- 여러 상세를 한 번에 불러오는 배치 조회 — N+1을 IN 한 방으로
- 엑셀 업로드 파싱과 행 단위 검증 — 부분 실패를 다루는 법
- 왜 체크예외는 롤백하지 않는가 — Spring 기본 롤백 규칙
- 이미지가 딸린 CRUD 어드민을 만드는 표준 골격
- 에러를 하나씩 말고 한꺼번에 돌려주기 — 검증 오류 누적
- 롤백할 수 없는 작업을 되돌리는 법 — 보상 트랜잭션과 사가
- 부분 취소와 환불의 정합성
- 클라이언트가 보낸 금액을 믿지 마라
- 필요한 필드만 골라 응답하기 — Sparse Fieldset
- 로그와 응답에서 민감정보를 가리는 법
- 같은 객체, 다른 검증: 등록과 수정의 규칙 차이
- 불리언 플래그가 늘어나면 enum을 의심하라
- 여러 단계 입력을 안전하게 모으는 법
- 빠른 화면 응답과 서버 진실의 간극
- 충돌하지 않는 식별자를 만드는 법 — auto_increment부터 Snowflake까지
- 등록·수정·삭제를 하나의 상태 흐름으로
- 화면만 먼저, 기능은 나중에 — 운영 기능의 단계적 출시
- 같은 핸들러로 HTML과 JSON을 모두 줄 때
- 무한 스크롤을 받치는 커서 페이지네이션
- 서버 시간과 사용자 시간이 다를 때
- 입력 길이를 제한하지 않으면 생기는 일
- 누가 언제 무엇을 바꿨는가: 감사 로그 설계
- 프런트 검증은 UX, 서버 검증은 안전
- 컨트롤러가 뷰에 넘기는 데이터의 계약
- 파라미터 기본값과 경계값을 서버가 정한다
- 목록과 총건수를 한 번의 왕복으로 — 운영 화면 응답 합치기
- SQL 인젝션: 문자열로 쿼리를 만들지 마라
- 중복 제출: 같은 요청이 두 번 오면
- 약관 링크를 코드에 박지 말고 테이블로 — 운영자가 바꾸는 값
- 남의 데이터를 보게 만드는 ID 하나
- DB에 저장하는 민감정보를 암호화하기
- 환불 금액을 문자열로 비교하면 생기는 일
- 새로고침하면 두 번 등록되는 버그
- 모달을 열 때 비로소 부르는 데이터 — 상세 지연 로딩
- 요청 DTO와 도메인 객체를 분리하는 이유
- @Valid 검증: 어디까지 컨트롤러에서 막을까
- association/collection과 N+1 쿼리의 함정
- 목록 응답을 감싸는 표준 봉투 설계
- @Transactional 전파: REQUIRED가 기본인 이유
- resultType vs resultMap, 무엇을 언제
- 검색 결과 0건과 NULL의 차이를 백엔드가 만든다
- 부분 수정: 변경된 필드만 UPDATE 하기
- 정렬·필터 파라미터를 화이트리스트로 막기
- resultMap: 컬럼과 객체를 잇는 다리
- 특수문자와 엔터키가 데이터를 깨뜨릴 때
- 저장된 검색어가 스크립트가 되는 순간
- 동적 검색조건을 안전하게 조립하는 법