분류 전체보기 954

45. @Transactional 옵션

트랜잭션 매니저를 등록할 수 있다. @Transactional(vlaue="트랜잭션매니저빈이름") 보통 기본으로 등록된 걸 사용해서 대부분 생략. 우리가 커스텀한걸로 사용하려면 저렇게 해야 함. 보통 뭐 DB 두개 쓸 때 그럴수도 있으려나? @Transactional(rollbackFor= Exception.class) 기본 트랜잭션 정책은, 런타임에러 등 언체크예외는 롤백, 체크예외는 커밋한다. rollbackFor 해서 롤백할 예외를 추가시킨 것이다. 또 반대로 noRollbackFor도 있다. propagation 트랜잭션 전파에 대한 옵션인데, 추 후 설명 isolation 트랜잭션 격리 수준 지정 가능 기본값은 DEFAULT이고, 이건 DB에 설정한 기준에 따르는 거임. 보통 애플리케이션 개발자..

카테고리 없음 2023.10.15

44. 트랜잭션 AOP 주의사항 -초기화 시점

스프링 초기화 시점, 에는 트랜잭션 AOP가 적용이 되지 않을 수도 있다. Custom init() 저 부분 인 듯? 그러니까, @PostConstruct가 의존성 주입 이후 우리가 뭔가 초기화? 작업같은 거 해 두고 싶을 때 저거 붙인 메소드 만들면 알아서 실행이 되는데, 만약 @PostConstruct @Transactional 이렇게 있으면 @Transactional이 적용이 되지 않을 수도 있다. 순서가 @PostConstruct 등 초기화가 모두 된 다음에 프록시로써 쓸 수 있다. @SpringBootTest public class InitTxTest { @Autowired Hello hello; @Test public void initTx(){ } @TestConfiguration static..

43. 트랜잭션 AOP 주의사항 2 -프록시 내부호출

스프링 트랜잭션 AOP기능은 public 메소드만 적용 됨. 그리고 이건 실무에서도 쓰는 방법중 하나인데, @Transactional 없는 메소드 -> @Transactional 있는 메소드 이런 식 일시, @Slf4j @SpringBootTest public class InternalCallV2Test { @Autowired CallService callService; @Test void printProxy(){ log.info("callService class={}", callService.getClass()); } @Test void externalCallV2(){ callService.external(); } @TestConfiguration static class InternalCallV1Tes..

42. 트랜잭션 AOP 주의사항 -프록시 내부 호출

트랜잭션이 제대로 적용 안되는 문제, 그로 인하여 default인 오토커밋모드로 커밋되어 rollback을 해도 의도되로 안되는.. 우선 다음 코드를 보자. @Slf4j @SpringBootTest public class InternalCallV1Test { @Autowired CallService callService; @Test void printProxy(){ log.info("callService class={}", callService.getClass()); } @Test void internalCall(){ callService.internal(); } @Test void externalCall(){ callService.external(); } @TestConfiguration static ..

41. 스프링 트랜잭션 우선순위

이게 보니까 우리가 스프링 트랜잭션 한번 배웠긴 했는데 다시 배우는 게 이번에는 좀 더 깊게? 어떻게 일어나는 지 그거 보는거랑 트랜잭션 추가 기능? 트랜잭션에 우리가 @Transactional(옵션이름=값) 이런 식으로 줄 수 있는데, 우선순위라는 게 예를 들어 @Transactional(옵션1 = 값1) class TxClass{ @Transactional(옵션1 = 값2) public void txTest(){ } } 하면 저 값2가 적용된다는 이야기. 사실 더 자세할 수록 그것이 적용된다는 것은 어느정도 프로그래머 입장에서는 통설로 받아들여져서.. @SpringBootTest @Slf4j public class TxLevelTest { @Autowired LevelService service; @..

40. 스프링 트랜잭션 테스트

트랜잭션 가져왔다. 먼저, 테스트 환경에서 로그 보기 위해 testAnnotationProcessor 'org.projectlombok:lombok' testImplementation 'org.projectlombok:lombok' build.gradle에 추가, 그 다음 application.properties에 logging.level.org.springframework.transaction.interceptor = TRACE 로그 중 트랜잭션의 것을 인터셉트 해 오는데 TRACE 레벨을 인터셉트 해 옴 @Slf4j @SpringBootTest public class TxBasicTest { @Autowired BasicService basicService; @Test void proxyCheck()..

39. DB 접근 기술의 조합

딱 정답이 있다곤 할 수 없음. 상황에 맞춰, 사람에 맞춰 하는 게 좋다고 생각. JdbcTemplate, MyBatis는 SQL을 직접 작성해야 하므로, SQL에 익숙한 집단에게 좋음. JPA, 스프링데이터JPA, Querydsl은 배울 필요가 있지만, 생산성이 높아짐. 예를 들어 거의 7~80% 통계쿼리만 작성해야 하는 프로젝트면 MyBatis도 괜찮음. 근데 보통 애플리케이션은 로직과 약간 일부의 통계 보통 이런 식이긴 하다. 그래서 보통 선생님이 추천하는 방식은, JPA, SpringDataJPA, Querydsl을 기본으로 사용하면서, 해결이 잘 안되는 복잡한 쿼리를 직접 짜는게 나을 경우 JdbcTemplate나 MyBatis 등을 함께 사용. 거의 실무에서 95%정도 JPA,SpringDat..

38. 실용적인 구조로 변환

기존 에서 이 구조로 한번 변화시켜 볼 것이다. Service에서 자동으로 생성되는 SpringDataJPA를 직접 쓰면서, Querydsl이 필요한, 복잡한 동적 쿼리가 필요한 것은 저렇게 우리가 구현해 놓은 리포지토리를 쓴다. 즉, 같은 테이블 이지만 리포지토리를 2종류 쓰는 것이다. 여튼, 스프링데이터JPA는 스프링데이터JPA상속받은 인터페이스를 만들어 놓으면, 자동으로 빈에 등록이 되고, Querydsl쓰는 리포지토리는 만들어서, 그 두개를 서비스에서 적절히 사용하면 된다. @Entity //@Table(name="item") public class Item { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Co..

Emit

이벤트 자체를 하위 컴포넌트에 넘길 수 있다. 예를 들어 aaa import MyBtnComponent from './components/MyBtnComponent.vue'; export default{ components:{ MyBtnComponent }, methods:{ log(){ console.log("Clicked."); } } } 이렇게 상위컴포넌트에서 MyBtnComponent에게 클릭이벤트를 추가시켰다. 근데 MyBtnComponent에서 click event export default{ emits:[ 'click' ] } 저렇게 emits의 'click' 이벤트를 받아 놓으면, 그러니까.. 상위 컴포넌트의 클릭이벤트 log가 콜백함수로 전달 된 거다. 그 다음, h1에 클릭이벤트로 그 ..

Vue.js 2023.10.13

최상위 요소(최상위 엘레멘트)

이렇게 최상위 요소 2개로 하지 마셈. 최상위 요소는 하나만 두셈. template 자체는 그냥 그룹핑 하는 거지 html 태그가 아님. 그래서 실제로 랜더링 될 때는 저 template 벗겨지면서 template, vue에서는 다른 컴포넌트에서 불러올 때 저기에 막 속성도 주고 그랬는데, html에서는 저게 벗겨지면서 최상위 요소로 상속되는데, 최상위 요소가 여러개면 상속이 안됨. 근데, 아예 외부에서 지정해주는 속성이나 props나 받기 싫으면 export default{ inheritAttrs : false } 이렇게 inheritAttrs를 false로 해주면 상속받지 않음. 뭔가 상속받은 걸 쓰고 싶다 $attrs 객체로 쓰면 됨. $attrs.class $attrs.style 아니면 v-bin..

Vue.js 2023.10.13