일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Flush
- 플러시
- DiscriminatorColumn
- 영속성 컨텍스트
- relational database
- Spring
- JPA
- Embeddable
- 정렬
- 분할상환분석
- 영속성전이
- Algorithm
- Spring Data JPA
- 순수jpa
- fetch join
- relational DB
- 값타입
- MappedSuperclass
- n+1문제
- 관계형 데이터베이스
- 엔티티 매핑
- 페치조인
- 고아객체
- Amortized Analysis
- 지연로딩
- 즉시로딩
- DiscriminatorValue
- DB
- commit
- ROLLBACK
- Today
- Total
목록Programming (16)
Jun's note
1. 배경 나는 코드 한줄을 적더라도 깊이있게 생각한 다음에 작성한다. 그러다 문득 전역변수, 정적변수, 지역변수는 어떻게 관리되는지 궁금해 찾아보았다. 자바도 하나의 가상머신을 통해 작동되기 때문에 메모리관리는 OS메모리관리와 비슷하다. 2. 정리 1) JVM 구조 크게 5가지 영역으로 나눌수있다. 메소드영역 전역변수가 저장된다. 스레드가 메소드영역에 있는 값을 공유할 수 있다. -> 여러 스레드가 동시에 하나의 공유변수의 값을 변경하면 문제가 발생하여 동기화 과정이 필요할 수 있다. -> 전역변수를 사용할때는 final 키워드를 되도록이면 사용하여 문제가 안생기도록 조심하자! 소멸시기: 프로그램이 종료할때 메소드영역에 있는 변수들이 소멸된다. 힙영역 동적으로 할당된 변수, 참조타입 (reference..
JPQL은 1차캐시를 확인하지 않고 바로 DB에 쿼리문을 날린다. JPA의 큰 장점에는 1차캐시와 변경감지 기능이 있었다. 우리가 값을 조회할때 먼저 DB를 확인하지 않고 1차캐시부터 확인한다. 1차캐시에 찾던 값이 존재하면 1차캐시만 확인하고, 1차캐시에 없을 경우에 DB를 조회한다. 만약 직접 JPQL로 update문을 수행하면 어떤일이 일어날까? 1. JPQL 수행 2. 트랜잭션이 커밋되면, 쿼리문이 DB에 반영된다. (DB에는 변경된 값이 업데이트됨) 이 때, 값을 조회하면 (1차캐시에 있는) 3. 1차캐시를 확인하여 값을 넘겨준다. 4. 넘겨받은 값은 수정안된 값이었다. -> 문제발생 문제점: JPQL로 직접 update했기때문에 1차캐시랑 DB에 저장된 값이 서로 다른 상황 만약 1차캐시에 없..
1. 배경 프로젝트에서 하던 중에 궁금증이 생겼다. 상수 변수를 내가 하나의 값을 지정해서 사용할지, 랜덤함수를 통해 생성된 임의값을 사용할지 고민했다. final Long userId1= 1L; vs final Long userId2= new Random().nextLong(); 이 둘의 차이가 궁금했다. 결론은 '이 둘은 메모리 측면에서 볼때 거의 비슷하다' 이다. 2. 이유 이는 Long이 참조타입이기때문이다. 참조타입은 heap에 실제값이 저장되고 저장된 메모리 주소값을 stack에 저장한다. 그래서 userId1의 실제값은 heap에서 생성된다. userId2는 new연산자를 통해 정의했기때문에 당연히 heap에서 생성된다. 즉, userId1과 userId2 두 변수 모두 실제값은 heap에 ..
@ModelAttribute는 Spring MVC에서 사용된다. (주로 jsp와 같은 뷰템플릿과 함께 사용한다.) - 동작방식 예시코드 참고해서 정리해본다. @Controller public class UserController { @Autowired private UserService service; @GetMapping("/user-info") public String getUserInfo(@ModelAttribute("user") UserInfo userInfo, Model model) { model.addAttribute("result", service.getUserInfo(userInfo)); //userInfoVO 반환 //Model return "user-info";//View } } pub..
1. 트랜잭션의 개념 "쪼개질 수 없는 업무처리의 단위"를 의미하며, db에서는 "데이터베이스가 수행하는 작업의 단위"를 의미한다. 2. 트랜잭션 예시 ex1) ATM으로 계좌이체를 할 경우, 1. A 은행에서 돈을 출금하여 B 은행에 송금하려고 한다. 2. 송금 중 오류가 생겨, B 은행에 돈이 송금되지 않았는데 A은행에서는 돈이 빠져나갔다. 이와 같은 상황을 막기 위해서는 1,2번 과정이 하나의 작업으로 이뤄져있어야한다. 1번 과정에서 에러가 발생하는 경우 지금까지 했던 과정을 다 취소하고 처음 상태로 복구해야한다. (이 과정은 Rollback이다) ex2) 게시판에 글을 업로드하고 내가 쓴 글을 게시판에서 확인한다. (db측면에서) 이는 질의어(select, insert, delete 등)를 통해 ..
페치 조인(fetch join)이란 JPQL에서 성능 최적화를 위해 제공하는 기능이어서 SQL의 조인 종류와는 다르다. 먼저 페치 조인에 대해 알아보기전에, JPQL과 SQL에 대해 간단히 정리해본다. - JPQL: 엔티티를 대상으로 검색하는 객체지향쿼리 (어차피 JPQL식으로 코드 짜서 나중에 SQL로 자동 변환됨) 장점 -> 특정 데이터베이스 SQL에 의존 X - SQL: 테이블을 대상으로 - QueryDSL사용시 주의사항: 수동 flush해주기 (왜? 영속성 디비에 저장된것을 커밋을 통해 실제 디비에 옮겨주는데, 커밋이 뒤에 나오니깐 결과가 0이어서 제대로 결과값이 나오지 않음-> 그러니 em.flush() 수동으로 해주기) - 동적쿼리!!! , 자바 코드로 쿼리를 짜기때문에 SQL로 오류난 것을 ..
JPA를 사용할 때 변수값을 3가지 타입으로 정의할 수 있다. 1. 기본값 타입 2. 임베디드 타입 (복합 값 타입) (예, 좌표 x,y를 하나의 값으로 함께 사용) 3. 컬렉션 값 타입 (기본값 타입과 임베디드 복합해서 사용?) 1. 기본값 타입 기본타입 vs 객체타입 int, double - 변수를 공유하지 않음 (값 변경 x) (메모리에 각각의 주소에 할당됨) (값을 전달,복사하는 것) Integer, Long(클래스) - 변수를 공유 o (왜? 레퍼런스를 참조하기 때문, 주소를 연결시켜주기 때문에 다른 변수여도 저장소는 같은곳) (참조를 전달) 2. 임베디드 타입 연관되어있는 값끼리 묶어 하나의 클래스로 해결 (엔티티 X) 쉽게 말하면, 1. "회원 엔티티는 이름, 근무 시작일, 근무 종료일, 주..
먼저 영속성 전이에 대해 정리할것이다. 영속성 전이는 프록시나 지연로딩과 관련 없는 내용이다. (연관관계랑 관련 x) 이 점을 주의해야한다! 1. 영속성 전이(CASCADE) 부모 엔티티를 저장할때 자식 엔티티도 저장되도록 (부모를 기준으로 개발) 목적 : 개발의 편리함 때문 부모와 자식은 상속관계는 x 예를 들어, Member엔티티안에 Team도 있다면, Member객체를 저장할때 Team도 자동 저장되도록 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공 (주의!!!) 사용 방법: cascade 사용 @OneToMany(mappedBy="parent", cascade=CascadeType.ALL) 주의사항 부모랑 자식의 라이프스타일이 비슷할 경우에 사용(둘다 수정한다던지, 둘다 삭제..