@Transactional 에너테이션은 내용을 수정할 때 사용한다고 생각했다.
정확하게 어떤 기능을 하는지 알아보자 !
- 데이터베이스의 상태를 변경하는 작업 or 한 번에 수행되어야 하는 연산들
- begin, commit을 자동으로 수행
- 예외가 발생하는 경우 rollback 처리를 자동으로 수행
- 원자성(Atomicity): 한 트랜잭션 내에서 실행한 작업들을 하나의 단위로 처리.
(모두 실패 혹은 모두 성공)- 일관성(Consistency): 일관성 있는 데이터베이스 상태를 유지
- 고립성(Isolation): 동시에 실행되는 트랜잭션들끼리 서로 영향을 미치지 않도록 고립
- 영속성(Durability): 트랜잭션을 성공적으로 실행하면 결과가 항상 저장
Spring에서는 간단하게 에너테이션 방식으로 처리
@Transactional을 메소드나 클래스, 인터페이스 위에 추가해 사용하는 방식이 일반적
이 방식을 선언적 트랜잭션이라고 부르며, 적용된 범위 내에서는 트랜잭션 기능이 포함된 프록시 객체가 생성되어 자동으로 commit 혹은 rollback을 진행
* 프록시 객체: 실제 Entity를 필요할 때만 꺼내서 쓸 수 있도록 하는 가짜 객체
- Default 값은 false 이며, true로 설정할 경우, 데이터의 삽입, 수정, 삭제 실행 시 예외가 발생
- 예상하지 못한 Entity의 등록, 변경, 삭제를 예방 & 성능 최적화 가능
스프링 프레임워크가 Hibernate 세션 플러시 모드를 MANUAL로 설정
강제로 플러시를 호출하지 않는 이상 플러시가 일어나지 않음
→ 트랜잭션을 commit해도 영속성 컨텍스트가 플러시 되지 않아 Entity의 등록, 수정, 삭제 불가
→ 읽기 전용으로, 영속성 컨텍스트는 변경 감지를 위한 스냅샷을 보관하지 않아 성능 향상
@Transactional은 기본적으로 Unchecked Exception과 Error만을 rollback
그렇기 때문에 모든 예외에 대해서 rollback을 진행하고자 하는 경우
(rollback = Exception.class)를 붙여주어야 함
→ 예상되는 에러인 Checked Exception과는 다르게 Unchecked Exception과 Error의 경우 예상치 못한 에러이기 때문
출처: https://velog.io/@kdhyo/JavaTransactional-Annotation-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90-26her30h
출처: https://willseungh0.tistory.com/75
출처: https://whitepro.tistory.com/414
예외(Exception) - 프로그램 코드에 의해 수습이 가능한 다소 미약한 오류
cf) 예외와 에러는 모두 실행 시(runtime)에 발생하는 오류
예외처리(Exception Handling)
- 정의: 프로그램 실행 시 발생 가능한 예외 발생에 대비한 코드를 작성
- 목적: 프로그램의 비정상 종료를 방지하고, 정상적 실행상태를 유지하는 것
예외의 종류
- RuntimeException: 프로그래머의 실수로 발생하는 예외 → 예외처리 선택
- Exception: 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외 → 예외처리 필수
- 적합하지 않거나 (illegal) 적절하지 못한(inappropriate) 인자를 메소드에 넘겨주었을 경우 발생
- RuntimeException을 상속받음
- Uncheked Exception이며 처리를 해주지 않아도 컴파일에는 문제가 없음
- 부정 혹은 부적절한 때에 메서드가 불려갔을 경우 발생
- Java의 환경 혹은 Java 어플리케이션이 요구된 오퍼레이션에 적절한 상태가 아님
- RuntimeException을 상속받음
출처: Java의 정석 기초편
출처: https://help.acmicpc.net/judge/rte/IllegalArgumentException
출처: https://velog.io/@injoon2019/IllegalArgumentException-vs-IllegalStateException
- NPE(Null Pointer Exception)이 가장 많이 발생하는 예외 중 하나
- NPE를 피하려면 null 여부를 검사해야 하는데,
- null 검사가 필요한 변수들이 많은 경우에는 코드가 복잡하고 번거로워진다.
- Optional 클래스를 사용해서 NPE를 방지할 수 있도록 도와줌
- Optiona은 null이 올 수 있는 값을 감싸는 Wrapper 클래스
- 값이 null이라고 해도 바로 NPE가 발생하지 않음
- 메소드의 결과가 null이 될 수 있으며, null에 의해 오류가 발생할 가능성이 매우 높을 경우 반환값으로만 사용되어야 함
- null일 경우, 대체하는 함수를 호출하는 등의 오버헤드가 있으므로 잘못 사용할 경우 시스템의 성능이 저하됨
→ 메소드의 반환 값이 절대 null이 아닌 경우는 Optional을 사용하지 않는 것이 좋음
- Boolean 타입
- Optional 객체가 값을 가지고 있다면 true, 값이 없다면 false 리턴
- Void 타입
- Optional 객체가 값을 가지고 있으면 실행하고, 값이 없으면 넘어감
isPresent() | ifPresent() |
---|---|
Boolean 타입 | Void 타입 |
true/false 체크 | 값을 가지고 있는지 확인 후 예외처리 |
출처: https://mangkyu.tistory.com/70
출처: https://sin0824.tistory.com/25
init() - service() - destroy()의 생명주기를 추상메소드로 갖는 인터페이스와
초기화를 담은 ServletConfig 인터페이스를 구현한 클래스
- 구현을 위해 두 인터페이스를 implements한 클래스가 있는데, 그것이 GenericServlet 클래스!
- 하지만 GenericServlet클래스보다 그의 자식 클래스인 HttpServlet 클래스가 일반적으로 사용됨 (Http 통신에 있어서 더 특화되어 있음)
- HttpServletRequest클래스와 HttpServletResponse 클래스의 객체를 파라미터로 받음
- HTTP 통신과 관련된 많은 데이터 처리 가능
- HTTP 요청에 따라 service 메서드의 실행이 8가지로 분기
→ 기본적으로 사용되는 4가지 (Get, Post, Put, Delete)
→ doGet(), doPost(), doPut(), doDelete()
- 요청을 받을 때 전달 받은 정보를 HttpServletRequest 객체를 생성해 저장
- 웹 브라우저에게 응답을 돌려줄 빈 HttpServletResponse 객체를 생성
- 생성된 HttpServletRequest(정보가 저장된)와 HttpServletResponse(빈)를 Servlet에게 전달
HTTP 요청 정보(클라이언트 요청, 쿠키, 세션 등)를 제공하는 인터페이스
- 사용 목적: HTTP 프로토콜의 request 정보를 Servlet에게 전달하기 위해
- Message Body의 Stream을 읽어들이는 메서드를 가지고 있음
- 메서드 예시
- getParameterNames(): 현재 요청에 포함된 매개변수 이름을 열거 형태로 넘김
- getParamerter(name): 문자열 name과 같은 이름의 매개변수를 가져옴
HTTP 응답 정보(요청 처리 결과)를 제공하는 인터페이스
- 사용 목적: content-type, 응답 코드, 응답 메시지 등을 담아서 Servlet에 담아서 전송
- Servlet으로 들어온 요청은 텍스트(HTML)로 응답을 보내기 때문에 출력 스트림을 받기 위해 주로 response로부터 writer 객체를 얻어서 내보냄
- 메서드 예시
- setContentType(): 요청에 대해 클라이언트에게 돌려줄 content-type 결정
- setCharacterEncoding()
출처: https://lordofkangs.tistory.com/37
출처: https://velog.io/@green9930/HttpServletRequest-HttpServletResponse-%EC%A0%95%EB%A6%AC
출처: https://zester7.tistory.com/33