일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 기술면접공부
- DDD
- 플러터 공부
- JPA 공부
- 코테공부
- JPA
- 기술공부
- 프로그래머스
- JPA스터디
- K8S
- 자바공부
- 스프링부트공부
- 스프링부트
- Axon framework
- querydsl
- JPA공부
- 알고리즘공부
- 코테준비
- 플러터 개발
- 자료구조공부
- Flutter
- 스프링 공부
- JPA예제
- 스프링공부
- nestjs스터디
- nestjs공부
- Kafka
- 스프링
- 카프카
- nestjs
- Today
- Total
DevBoi
잡다한 기술 지식_1 본문
1. 오버라이드 오버로딩 차이
둘다 메소드 구현 방식에 대한 개념
오버로딩 : 생성자 오버로딩, 메소드 오버로딩이 존재한다. (파라미터만 다르고 메소드 이름은 같은 것)
오버라이드 : 상속받은 class에서, 같은 메소드의 본문만 다르게 정의 하여 구현하는 것이다. (부모클래스의 메소드 재정의)
2. $,#차이 Mybatis
#는PreparedStatement를 의미한다.
select id from et_mbr_base where id = #{id} 라고하면,
해당 Oracle로 select id from et_mbr_base where id = ? 가 넘어가게 되고
실제 수행은 select id from test where id = 'devboi'가 된다.
$는 Statement를 의미한다.
select id from et_mbr_base where id = #{id} 로하게 되면,
select id from et_mbr_base where id = devboi 가 넘어가게 된다.
#를 사용하면, 오라클에서 변수를 바인드를 하여 ID값이 달라져도 같은 쿼리로 인식을 하게 된다.
성능 적으로 더 좋다.
하지만 $를 사용하게 되면, id 값이 달라지면 다른 쿼리로 인식, 성능 저하의 문제가된다 (캐싱하지 않기 때문에)
-> 사용자의 입력을 받는 경우에는 성능, SQL injection 보안 위험이 발생하기 때문에, 사용하지 않고
#을 사용한다.
3. JPA N+1 문제
JPA N+1의 문제, 해당 문제는 객체 연관성으로 비롯된다.
A라는 객체에 List<B>라는 속성이 있다면, 해당 A를 찾을때 List<B>에 대한 조회를 하기위해서
총 A개의 개수만큼, B를 조회하는 쿼리를 실행한다.
이를 방지하기 위해서는 Fetch type을 eager에서 lazy로 바꾸거나
Batch size설정 혹은 쿼리로, join을 걸어서 데이터를 조회해오도록 변경한다.
N+1을 발생하는 이유는, A라는 객체를 찾고나서 추가로 찾을때
A라는 객체의 PK값을 가지고오지않아 JOIN을 할수없는 것이고
이렇게 JOIN이 안되서, 전부 가져오는 것이다.
4. Transcational propagation (전파 레벨)
Transactional propagation이란 메소드 위에 Transactional 어노테이션을 붙이면,
해당 메소드에 대한 트랜잭션 처리가 가능할수 있다.
전파 레벨에 따라, 다르게 동작하는데 이부분에 대한 공부가 필요하다.
@Transactional(propagation = Propagation.REQUIRED)
해당 의 작업은 특정 메소드에 대한 호출한 곳에서, 트랜잭션이 설정되어있지 않다면,
새로생성하고 아니라면 기존 트랜잭션안에서 실행된다.
예외 발생시에 롤백되고 호출한 곳에서도 롤백이 전파된다. (기본값이다.)
@Transactional(propagation = Propagation.REQUIRES_NEW)
매번 새로운 트랜잭션으로 실행한다. 이미 기존에 트랜잭션이 설정되어 있다면, 기존 트랜잭션이 종료할때까지 대기
후에 자신의 트랜잭션을 실행한다. 새로운 트랜잭션 안에서 호출한 곳은 롤백이 전파되지않고
완전 분리된 별개의 단위로 계산한다.
@Transactional(propagation = Propagation.NESTED)
특정 세이브 포인트까지 저장가능하다, DB의 지원이 필요하다(오라클) -> 요건 정확히 알아야 된다.
결국 자식이 문제인경우, 핵심은 체크포인트이고, NESTED 호출 직전까지 저장을 해놓는다.
즉 자식이 문제가 생기면, 자식은 롤백, 부모는 커밋이된다.
'[Computer Science]' 카테고리의 다른 글
잡다하지만 필요한 기술지식 3 (0) | 2021.07.19 |
---|---|
잡다한 기술지식 2 (0) | 2021.07.14 |
비동기 vs 동기 통신 방법 (0) | 2021.07.11 |
[개발지식] 쿠키와 세션 비교 (0) | 2021.07.09 |
Redis 기초 개념 및 공부 (0) | 2021.06.29 |