Develop Artifacts/Spring

Spring - 10. data-access

SQLException이 DataAccessException으로 바뀌는 순간 — 데이터 접근 추상화try { jdbcTemplate.queryForObject("SELECT name FROM users WHERE id = ?", String.class, id);} catch (SQLException e) { // 이 catch 블록은 실행되지 않는다}JdbcTemplate은 SQLException을 던지지 않는다. Spring은 모든 데이터 접근 예외를 unchecked DataAccessException 계층으로 변환한다 — 벤더별 에러 코드(MySQL 1062, PostgreSQL 23505, Oracle 1)를 통일된 타입(DuplicateKeyException 등)으로 매핑한다.이 글은..

Develop Artifacts/Spring

Spring - 09. transaction

@Transactional이 rollback하지 않는 예외 — 트랜잭션 관리의 함정@Servicepublic class TransferService { @Transactional public void transfer(Long from, Long to, long amount) { accountRepository.withdraw(from, amount); try { externalService.notify(to); // 외부 API 호출 실패 } catch (Exception e) { log.warn("알림 실패", e); // 예외를 잡아서 처리함 } accountRepositor..

Develop Artifacts/Spring

Spring - 08. validation exception

@Valid가 거부한 요청이 어떤 응답이 되는가 — 검증과 예외 처리 파이프라인@PostMapping("/api/users")public UserDto create(@Valid @RequestBody CreateUserRequest request) { ... }클라이언트가 {"email": "invalid", "age": -5}를 보냈다. @Valid가 검증을 수행하고, 실패하면 MethodArgumentNotValidException을 던진다. 이 예외를 처리하지 않으면 — 클라이언트는 Spring의 기본 에러 페이지(또는 500)를 받는다. 올바른 API는 구조화된 400 에러 응답을 반환해야 한다.이 글은 Bean Validation 3.1(Jakarta), @ControllerAdvice로 전역 ..

Develop Artifacts/Spring

Spring - 07. spring mvc

HTTP 요청이 @RestController 메서드에 도달하기까지 — Spring MVC의 처리 흐름브라우저에서 POST /api/orders를 보냈다. Spring MVC 내부에서는 — DispatcherServlet이 요청을 받고, HandlerMapping이 컨트롤러 메서드를 찾고, HandlerAdapter가 매개변수를 바인딩하고, 메서드를 실행하고, 결과를 JSON으로 변환하여 응답한다. 이 전체 과정을 이해하면 — 404의 원인, @RequestBody와 @ModelAttribute의 차이, 예외 처리 흐름을 추적할 수 있다.이 글은 Spring MVC의 요청 처리 파이프라인, DispatcherServlet의 역할, 컨트롤러 패턴, 그리고 Spring 7의 Servlet 6.1 기반 변경점을..

Develop Artifacts/Spring

Spring - 06. aop

@Transactional이 같은 클래스 내부 호출에서 동작하지 않는 이유 — AOP와 프록시@Servicepublic class OrderService { @Transactional public void placeOrder(Order order) { ... } // 트랜잭션 적용됨 public void bulkOrder(List orders) { for (Order order : orders) { placeOrder(order); // 내부 호출 — @Transactional이 동작 안 함! } }}placeOrder()에 @Transactional이 붙어 있지만, 같은 클래스 내부에서 호출하면 트랜잭션이 적용되지 않는다. 원인은..

Develop Artifacts/Spring

Spring - 05. bean scope profile

singleton bean에 state를 넣으면 안 되는 이유 — 스코프와 프로파일웹 애플리케이션에서 @Service UserContext bean에 사용자 ID를 저장했다. 동시에 100명의 사용자가 접속하면 — 마지막 사용자의 ID가 모든 요청에 보인다. singleton bean은 모든 스레드가 공유하므로, 상태를 넣으면 경쟁 조건이 발생한다. 이 글은 bean 스코프의 종류, prototype의 함정, 그리고 @Profile로 환경을 분리하는 방법을 풀어간다.Bean 스코프 — bean의 생명 주기 정책flowchart TD S["singleton (기본)컨테이너당 1개 인스턴스"] --> P["prototype요청마다 새 인스턴스"] P --> R["request (웹)HTTP 요청마..

Archive

'spring' 10

Develop Artifacts/Spring

Spring - 10. data-access

SQLException이 DataAccessException으로 바뀌는 순간 — 데이터 접근 추상화try { jdbcTemplate.queryForObject("SELECT name FROM users WHERE id = ?", String.class, id);} catch (SQLException e) { // 이 catch 블록은 실행되지 않는다}JdbcTemplate은 SQLException을 던지지 않는다. Spring은 모든 데이터 접근 예외를 unchecked DataAccessException 계층으로 변환한다 — 벤더별 에러 코드(MySQL 1062, PostgreSQL 23505, Oracle 1)를 통일된 타입(DuplicateKeyException 등)으로 매핑한다.이 글은..

댓글
Develop Artifacts/Spring

Spring - 09. transaction

@Transactional이 rollback하지 않는 예외 — 트랜잭션 관리의 함정@Servicepublic class TransferService { @Transactional public void transfer(Long from, Long to, long amount) { accountRepository.withdraw(from, amount); try { externalService.notify(to); // 외부 API 호출 실패 } catch (Exception e) { log.warn("알림 실패", e); // 예외를 잡아서 처리함 } accountRepositor..

댓글
Develop Artifacts/Spring

Spring - 08. validation exception

@Valid가 거부한 요청이 어떤 응답이 되는가 — 검증과 예외 처리 파이프라인@PostMapping("/api/users")public UserDto create(@Valid @RequestBody CreateUserRequest request) { ... }클라이언트가 {"email": "invalid", "age": -5}를 보냈다. @Valid가 검증을 수행하고, 실패하면 MethodArgumentNotValidException을 던진다. 이 예외를 처리하지 않으면 — 클라이언트는 Spring의 기본 에러 페이지(또는 500)를 받는다. 올바른 API는 구조화된 400 에러 응답을 반환해야 한다.이 글은 Bean Validation 3.1(Jakarta), @ControllerAdvice로 전역 ..

댓글
Develop Artifacts/Spring

Spring - 07. spring mvc

HTTP 요청이 @RestController 메서드에 도달하기까지 — Spring MVC의 처리 흐름브라우저에서 POST /api/orders를 보냈다. Spring MVC 내부에서는 — DispatcherServlet이 요청을 받고, HandlerMapping이 컨트롤러 메서드를 찾고, HandlerAdapter가 매개변수를 바인딩하고, 메서드를 실행하고, 결과를 JSON으로 변환하여 응답한다. 이 전체 과정을 이해하면 — 404의 원인, @RequestBody와 @ModelAttribute의 차이, 예외 처리 흐름을 추적할 수 있다.이 글은 Spring MVC의 요청 처리 파이프라인, DispatcherServlet의 역할, 컨트롤러 패턴, 그리고 Spring 7의 Servlet 6.1 기반 변경점을..

댓글
Develop Artifacts/Spring

Spring - 06. aop

@Transactional이 같은 클래스 내부 호출에서 동작하지 않는 이유 — AOP와 프록시@Servicepublic class OrderService { @Transactional public void placeOrder(Order order) { ... } // 트랜잭션 적용됨 public void bulkOrder(List orders) { for (Order order : orders) { placeOrder(order); // 내부 호출 — @Transactional이 동작 안 함! } }}placeOrder()에 @Transactional이 붙어 있지만, 같은 클래스 내부에서 호출하면 트랜잭션이 적용되지 않는다. 원인은..

댓글
Develop Artifacts/Spring

Spring - 05. bean scope profile

singleton bean에 state를 넣으면 안 되는 이유 — 스코프와 프로파일웹 애플리케이션에서 @Service UserContext bean에 사용자 ID를 저장했다. 동시에 100명의 사용자가 접속하면 — 마지막 사용자의 ID가 모든 요청에 보인다. singleton bean은 모든 스레드가 공유하므로, 상태를 넣으면 경쟁 조건이 발생한다. 이 글은 bean 스코프의 종류, prototype의 함정, 그리고 @Profile로 환경을 분리하는 방법을 풀어간다.Bean 스코프 — bean의 생명 주기 정책flowchart TD S["singleton (기본)컨테이너당 1개 인스턴스"] --> P["prototype요청마다 새 인스턴스"] P --> R["request (웹)HTTP 요청마..

댓글

wall

방명록

방문 흔적을 남겨주세요. 질문이나 인사 모두 환영합니다.