일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 웹개발
- MYSQL
- DB
- 시큐리티
- 카프카
- JavaScript
- JWT
- 프로그래머스
- CentOS
- 스파르타코딩클럽
- docker
- @jsonproperty
- 개인프로젝트
- visualvm
- 패스트캠퍼스
- 남궁성과 끝까지 간다
- 항해99
- 쇼트유알엘
- Spring Security
- EC2
- Kafka
- 생성자 주입
- java
- AWS
- 스프링의 정석
- emqx
- 스웨거
- 데이터베이스
- Spring
- WEB SOCKET
- Today
- Total
Nellie's Blog
[TIL-221130수] 항해99 17일차 본문
배운점
@Transactional 어노테이션
@Transactional은 클래스나 메서드에 붙여줄 경우, 해당 범위 내 메서드가 트랜잭션이 되도록 보장해준다.
선언적 트랜잭션이라고도 하는데, 직접 객체를 만들 필요 없이 선언만으로도 관리를 용이하게 해주기 때문.
특히나 SpringBoot에서는 선언적 트랜잭션에 필요한 여러 설정이 이미 되어있는 탓에, 더 쉽게 사용할 수 있다.
- 연산이 고립되어, 다른 연산과의 혼선으로 인해 잘못된 값을 가져오는 경우가 방지된다.
- 연산의 원자성이 보장되어, 연산이 도중에 실패할 경우 변경사항이 Commit되지 않는다.
위의 속성이 보장되기 때문에, 해당 메서드를 실행하는 도중 메서드 값을 수정/삭제하려는 시도가 들어와도 ,
값의 신뢰성이 보장된다.
또한, 연산 도중 오류가 발생해도 rollback해서 DB에 해당 결과가 반영되지 않도록 할 수 있다.
(위의 코드가 조회 코드가 와닿지 않을 수 있지만, 생성/수정/삭제 도중 오류가 발생한다고 생각해보자!!)
그렇다면 @Transactional이 붙은 메서드를 호출할 경우, 우리 코드에는 어떤 일이 벌어질까?
@Transactional이 클래스 내지 메서드게 붙을 때, Spring은 해당 메서드에 대한 프록시를 만든다.
프록시 패턴은 디자인 패턴 중 하나로, 어떤 코드를 감싸면서 추가적인 연산을 수행하도록 강제하는 방법이다.
트랜잭션의 경우, 트랜잭션의 시작과 연산 종료시의 커밋 과정이 필요하므로, 프록시를 생성해 해당 메서드의 앞뒤에 트랜잭션의 시작과 끝을 추가하는 것이다.
이러한 로직은 AOP에 바탕을 두고 설계되었기 때문에, 이후 설명에서 해당 프록시는 트랜잭션 AOP로 명칭하겠다.
서비스 클래스에서 @Transactional을 사용할 경우,
해당 코드 내의 메서드를 호출할 때 영속성 컨텍스트가 생긴다는 뜻이다.
영속성 컨텍스트는 트랜잭션 AOP가 트랜잭션을 시작할 때 생겨나고, 메서드가 종료되어 트랜잭션 AOP가 트랜잭션을 커밋할 경우 영속성 컨텍스트가 flush되면서 해당 내용이 반영된다. 이후 영속성 컨텍스트 역시 종료되는 것이다.
@RequiredArgsConstructor 어노테이션을 사용한 생성자 주입 방법
생성자주입의 단점은 위의 Constructor(생성자) 코드처럼 생성자를 만들기 번거롭다는 것이다. 하지만 이를 보완하기위해 롬복을 사용하여 간단한 방법으로 생성자 주입 방식의 코딩을 할 수 있다.
@RequiredArgsConstructor
final이 붙거나 @NotNull 이 붙은 필드의 생성자를 자동 생성해주는 롬복 어노테이션
필드 주입방식을 사용한 기존 Service
@Service
public class BannerServiceImpl implements BannerService {
@Autowired
private BannerRepository bannerRepository;
@Autowired
private CommonFileUtils commonFileUtils;
@RequiredArgsConstructor 를 활용한 생성자 주입
@Service
@RequiredArgsConstructor
public class BannerServiceImpl implements BannerService {
private final BannerRepository bannerRepository;
private final CommonFileUtils commonFileUtils;
...
느낀점
하루종일 스프링부트 과제를 했다.
개인블로그 만드는 과제인데 , 간단해보이긴 하지만 처음보는 어노테이션들이나, JPA의 데이터이동이 헷갈려서 구글링으로 찾아보며 만드느라 시간이 너무 빨리 갔다. 여기까지 만들었는데 너무 졸려서 그만 자야겠다.....
HTML/CSS도 어려운것같다. UI가 왜이렇게 못생겼지....ㅠㅠ ;;
내일 과제 제출도 있고, 시험도 있으니 조금만 자고 새벽에 일어나서 후딱 과제 완성하고 시험도 잘 봐야겠다.
출처
https://sowon-dev.github.io/2021/09/06/210907Jpa-entityVSDto/
'회고록' 카테고리의 다른 글
[TIL-221202금] 항해99 19일차 (0) | 2022.12.02 |
---|---|
[TIL-221201목] 항해99 18일차 -[Spring] 회원 조회 API 만들기 시험 (0) | 2022.12.01 |
[TIL-221129화] 항해99 16일차 (0) | 2022.11.29 |
[TIL-221128월] 항해99 15일차 (0) | 2022.11.29 |
[TIL-221125금] 항해99 12일차 (0) | 2022.11.25 |