스프링도 시작한지 벌써 한 달이 다 되었다. 시간 진짜 빠르다...
한 달동안 기억 나는 거... 내가 할 줄 아는 게 있나...? 😵💫
MVC 동작방식 정리할 때 까지만 해도 그리고 Dto, Mapper, Service 까지만 해도 과제를 나름 수월하게 진행했던 터라 복습을 하면서도 이해를 했다고 생각을 했다...근데 아마 콘텐츠에 내용이 매우 디테일하게 하나하나 나와있었기에 그런 생각을 가지게 되었던 것 같다.혼자서 할 수 있었나? 라고 하면 못할텐데 말이다.고작 동작의 흐름을 이해한다고 해서 구현을 할 수 있는 것은 아니었는데 너무 나를 과대평가 하고 있었던 것이었다.그걸 Spring Data JPA 에 들어오고 알게 되다니. 😱
🫠 나의 고민
오늘 질의 응답 시간에 고민에 대한 이야기를 털어 놓는 시간이 생겨 하게 되었다.
사실 다른 분들 고민들이 내가 작성해서 보내려던 것과 너무 비슷한 것이 많아 계속 작성하고 작성하다 보니 엄청 길어지게 되었다.
아래는 나의 고민이자 공통된 코스 동기들의 고민거리였다..
과제를 진행할 때 메서드 작성 시 정답을 보지 않으면 혼자 완성을 못합니다.
어떻게 공부하면 좋을까요?
스프링 컨트롤러부터 스스로 구현해보라는 조언을 주셨다.
그리고 스스로 구현을 해보며 스스로에게도 질문을 계속 던지고, 모르는 부분에 계속 질문을 던지라고 하셨다.
우선 컨트롤러부터 복습을 하는 것이 중요하다는 말씀을 오늘 가장 많이 하셨던 것 같다.
직접 구현하고 질문하라.
모르는 것을 많이 물어보고싶은데.. 제일 문제점은 제가 모르는 부분이 무엇인지 잘 모르겠다는 것인 듯 합니다. 메서드 작성하는 방법도 어렵고.. 흐름을 파악하는 것도 어려워서 자꾸 메서드 작성 자체에 초점을 두고 어떻게 해석하고, 어떻게 혼자서 작성 해야하는지 고민하게 됩니다. 사실 두 가지 모두 놓칠 수 없는 부분이기 때문에 매일 고민인 듯 합니다.
이건 참고 견뎌야 한다고... 하셨다...ㅋㅋㅋㅋㅋㅋㅋ
해야한다고
진짜 다행인건 중도 포기할 생각은 진짜 단 한 번도 0.000001프로도 들지 않는다는 것..? 중도 하차하시는 분들은 각자 이유가 있으시겠지만.. 나한테 묻는다면 왜? 라고 할 듯...
오히려 전에 학원 다니던 때가 너무 욕 나올 정도로 구려서 그런지 난 코스가 너무너무너무너무너무 좋다.
과정이 너무 만족스럽고 여기서 만나는 사람들도 너무 좋다.
다만.. 하루가 24시간이라는 것, 잠을 안 자면 안 된다는 것, 내 머리가 받아들이기에 진도가 너무 빠르다는 것이 너무 슬픈 점이고..
친구과의 약속이 꼭 생긴다는 것...이 나한테는 가장 큰 스트레스이다.
(다른 분들은 친구들 만나서 스트레스를 푼다는데 난 오히려 약속이 생기면 진짜 진짜 진짜....사실 나가기 싫다....헿)
사실 진짜 복습도 과제도 java 기초적인 부분들도 다 하나하나 신경쓰고 싶지만 그렇게 지나가지 못하는 것이 많다.
수업시간에 아무리 잘 들어도 그 날 보지 않으면 사실 다 까먹어 버리고 그 날 바로 복습해서 그 날 다 복습을 한 단원은 그래도 기억이 나고 그 날 복습을 완전히 끝내지 못한 단원은 못 끝난 채로 남아 버리니 말이다.ㅠㅠ
진짜 어려운 듯 하다. JPA부터 지금 막혀서 마음이 너무 조급하다ㅋㅋ
트랜잭션이라도 다 했어야했는데ㅎㅎ
오늘 조언을 들었음에도 쉽지는 않은 듯 하다.
그래서 오늘은 오늘 배웠던 내용을 간단히 정리만 하고 컨트롤러 부분을 구현해보고 자러 가볼까 한다.
🔽 트랜잭션
ㅁ 개념 : 데이터 베이스의 상태를 변환시키는 논리적 기능을 수행하는 작업 단위로 한 번에 모두 수행되어야 하는 연산을 의미
ㅁ ACID 원칙
Atomicity (원자성) : Commit 되던지 Rollback되던지 / 모두 반영되던지, 안되던지
Consistency (일관성) : 언제나 일관성있는 데이터베이스 상태로 변환한다. / 변환 전 후의 상태가 동일
Isolation (고립성) : 수행 중인 트랜잭션은 하나의 트랜잭션이 끝날 때 까지 끼어들 수 없음
Durablity (지속성) : 트랜잭션이 완료되면 시스템은 유지되어야 함
=======================================================================
ㅁ 체크 예외는 @Transactional 에너테이션만 추가해서는 rollback이 되지 않는다.
➡️ 체크 예외는 "체크 해야 하는 예외"
➡️ 캐치 한 후에 복구할지 회피할지 고민한다.
ㅁ 예외 전략이 필요 없다면 직접 지정해주거나 언체크 예외로 감싸서 rollback 동작
➡️ @Transactional(rollbackFor = {SQLException.class, DataFormatException.class})
=======================================================================
ㅁ @Transactional(readOnly = true) 읽기 전용 트랜잭션
➡️ 설정하더라도 commit 절차 진행
➡️ JPA 내부적으로 영속성 컨텍스트를 flush할 수도 있고 안 할 수도 있다.
* flush 란? 버퍼에 있는 데이터를 모두 처리하는 것
* h2는 처리 X
* 조회 메서드에는 readOnly = true 지정하는 것이 성능 측면에서 좋음
=======================================================================
ㅁ @Transactional 어노테이션에 따른 적용
- 클래스 레벨에만 @Transactional이 적용된 경우 : 클래스의 모든 메서드에 트랜잭션 설정이 일괄적으로 적용
➡️ 클래스의 모든 메서드가 트랜잭션으로 묶이는 것을 의미
- 클래스 레벨과 메서드 레벨에 함께 적용된 경우: 메서드 레벨의 @Transactional 애너테이션이 우선적으로 적용
➡️ 직접 적용된 트랜잭션 설정이 해당 메서드에만 적용
- 메서드 레벨에만 @Transactional이 적용된 경우: 해당 메서드에만 트랜잭션 설정이 적용
➡️ 클래스의 모든 메서드가 클래스 레벨의 트랜잭션 설정을 따른다
=======================================================================
트랜잭션 전파(Transaction Propagation)
트랜잭션의 경계에서 진행 중인 트랜잭션이 존재할 때 또는 존재하지 않을 때, 어떻게 동작할 것인지 결정하는 방식
"propagation Attribute"
ㅁ Propagation.REQUIRED
propagation 유형의 디폴트 값
진행 중인 트랜잭션이 없으면 새로 시작하고, 진행 중인 트랜잭션이 있으면 해당 트랜잭션에 참여
ㅁ Propagation.REQUIRES_NEW
이미 진행 중인 트랜잭션과 무관하게 새로운 트랜잭션이 시작 / 기존에 진행 중이던 트랜잭션은 새로 시작된 트랜잭션이 종료할 때까지 중지
ㅁ Propagation.MANDATORY
Propagation.MANDATORY는 진행 중인 트랜잭션이 없으면 예외를 발생
ㅁ Propagation.NOT_SUPPORTED
트랜잭션을 필요로 하지 않음
진행 중인 트랜잭션이 있으면 메서드 실행이 종료될 때까지 진행 중인 트랜잭션은 중지되며, 메서드 실행이 종료되면 트랜잭션을 계속 진행
ㅁ Propagation.NEVER
트랜잭션을 필요로 하지 않음
진행 중인 트랜잭션이 존재할 경우에는 예외 발생
=======================================================================
트랜잭션 격리 레벨(Isolation Level)
독립적으로 실행되어야 하는 격리성이 보장
ㅁ Isolation.DEFAULT
데이터베이스에서 제공하는 기본 값
ㅁ Isolation.READ_UNCOMMITTED
다른 트랜잭션에서 커밋하지 않은 데이터를 읽는 것을 허용
ㅁ Isolation.READ_COMMITTED
다른 트랜잭션에 의해 커밋된 데이터를 읽는 것을 허용
ㅁ Isolation.REPEATABLE_READ
트랜잭션 내에서 한 번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회
ㅁ Isolation.SERIALIZABLE
동일한 데이터에 대해서 동시에 두 개 이상의 트랜잭션이 수행되지 못하도록 함
=======================================================================
나중에 트랜잭션 공부하면서 더 찾아볼 것
ㅁ 트랜잭션 매니저
ㅁ JDK Dynamic Proxy
ㅁ CGLIB
그리고 오늘 공부하면서 처음에 바로 이해하지 못했던 것...
"AOP 방식의 트랜잭션 적용" 이라는 것을 해 보면서 @Transactional 과 함께 사용해야 하는 방식인줄 알고 이해하기 위해 외우기 위해 AOP 부분을 다시 찾아보고 강의 및 자료를 찾아보며 복습하는 시간을 가지기도 하였다.
그러다 checkpoint 시간에 AOP 방식의 트랜잭션 적용 방식 보다는 대부분의 개발자가 @Transactional 을 많이 쓴다. 라는 말을 듣고 아... 둘 중 하나를 쓰면 되는 것이구나 하고 깨닫게 되었다.
이제 Controller를 금방 보고 자야겠다.. !
'DIARY' 카테고리의 다른 글
[DIARY] 포맷 후 다시 설치하는 프로그램들 정리(Linux, Git, Java, IntelliJ, MySQL) / 나를 위한 정리 (0) | 2023.07.24 |
---|---|
[DIARY] 너무 빨리 지나가는 하루하루 벌써 코스 64일차..🥹 (1) | 2023.07.12 |
[DIARY] 뭐 한 건지 모르겠다.. 너무 빠른 하루 (0) | 2023.06.20 |
[DIARY] 과제 중 오류 / @RequestMapping 중 404에러... (0) | 2023.06.18 |
[DIARY] 코드스테이츠 44일차 / 스프링 MVC 예외처리 (1) | 2023.06.15 |