일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 의존성
- CircuitBreaker
- JPA
- 프로그래머스
- Docker
- 자바
- 우테코
- mock
- 우아한세미나
- Level2
- Spring Batch
- 프리코스
- JUnit5
- REDIS
- HTTP
- 미션
- 트랜잭션
- 세션
- AWS
- 스프링 부트
- yml
- MSA
- 백준
- Paging
- 레벨2
- 코드리뷰
- 스프링부트
- AOP
- 서블릿
- 우아한테크코스
- Today
- Total
목록백앤드 개발일지 (73)
늘
이번에는 JPA 기본을 중심으로 Batch 처리에 대해서 조금 다뤄보려고 한다. 저번 시간에 얘기 했던 것처럼 수백만 건의 배치 처리할 때, 일반적인 방식으로 엔티티를 계속 조회하면, 영속성 컨텍스트에 많은 엔티티가 쌓이면서 메모리 부족 오류가 발생한다. 따라서 이러한 배치 처리를 적절한 단위로 영속성 컨텍스트를 초기화해야 한다. 또한 2차 캐시를 사용하고 있다면 2차 캐시에 엔티티를 보관하지 않도록 주의해야 한다. [JPA 등록 배치] 수만 건 이상의 엔티티를 한 번에 등록할 때 주의할 점은 영속성 컨텍스트에 엔티티가 계속 쌓이지 않도록 일정 단위마다 영속성 컨텍스트의 엔티티를 데이터베이스에 플러시하고 영속성 컨텍스트를 초기화해야 한다. EntityManager em = entityManagerFact..
요즘 공부하다 배치 애플리케이션을 자주 보게 되어서 공부를 해보았다. 공부하다 보니 자료도 적어 찾기 어려웠고 대용량 데이터를 다루는 데에 사용한다고 하니 나 같은 대학생 나부랭이에겐 어렵게 다가왔다. 하지만 언젠가는 사용할게 분명하기 때문에 미리 맛보는 겸 공부하고 기록해 보려고 한다! 우선 배치 어플리케이션이 왜 필요하는지 그 이유부터 알아보겠다. 왜 사용하는 가?why why.. wh.. [배치 애플리케이션] 배치(Batch)는 일괄처리라는 뜻을 가지고 있다. 만약 매일 전 날의 데이터를 집계해야 한다고 가정해보겠습니다. 집계 기능은 하루에 1번 수행됩니다. 이를 위해 API를 구성하는 것은 너무 낭비일 것이다. 데이터가 많아서 처리 중 5만 번째에서 실패했다면, 5만 1번째부터 다시 실행할 수 있..
1차 캐시: @Id와 Entity 스냅샷: 1차캐시에 처음 영속되었을 때의 상태 findByName()과 같이 id가 아닌 값으로 조회를 하면 바로 DB에 접근하게 된다. 플러시 flush(): 영속성 컨텍스트의 내용을 디비에 반영 1차 캐시에 넣어둔게 사라진게 아님! 그냥 반영만 - 동기화 플러시 발생 flush()가 될때 -> 변경 감지-> 수정된 엔티티를 쓰기 지연 SQL저장소 등록 -> 쓰기 지연 SQL저장소의 쿼리 디비에 전송 같은 테이블, JDBC Driver지원, 하이버네이트 같을 때, 디비로 일괄 전송되는 것 영속성 컨텍스트 플러시 할 때 em.flush() - 직접호출 ex) test 트랜잭션 커밋 - 자동 호출 JPQL 쿼리 실행 - 자동 호출 jpql은 객체를 대상으로 하는 sql이므..
JPA만 사용하다가 오랜만에 JDBC를 공부해보려고 한다. 어느 정도 JDBC의 작동원리를 알아야 나중에 JPA를 더 깊이 공부할 때도 도움이 될 것 같다고 생각되기 때문이다. 기본적인 사용법을 알아두면 나중에 쓰일 수(?)도 있으니... JDBC는 JPA와 다르게 db에 날리는 쿼리를 직접 작성해야하는 단점이 있다. 대신 복잡한 쿼리를 작성할때는 직접 쿼리를 작성하므로 jpa보다 좋다. JDBC package com.example.demo.controller; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.State..
개발을 하다 보면 에러나 오류가 무수히 많이 발생하고 매번 블로그들 뒤져보면서 찾기 불편해서 이곳에 정리해두려고 한다. 계속 수정해가면서 이 글에 기록할 생각이므로 에러나 오류가 발생하면 여기서 찾아보자! [포트 죽이기] (power shell) netstat -ano taskkill /f /pid [pid] [Parameter value [1] did not match expected type: ] spring data jpa를 통해 레포지토리 작성할 때, 잘못 작성할때 발생! 쿼리문 주의 [CICD](젠킨스랑 travis)(배포) [2021.08.12] CI CD 하다가 화병 날 뻔했는데 드디어 오류 찾아서 뿌듯함에 사진까지 ㅎㅎㅎ..;;; 이런 오류가 마구 나와서 gralew build 할 때, 문..
자주 햇갈려서 정리해두었다. 짧고 굵게 이해하기 쉽게 정리해봤다. 식별자 부모테이블(상품, 주문테이블) 기본키(PK)가 자식 테이블(주문_상품)의 외래키이자 기본키로 사용되는 관계이다. 자식 테이블의 행(정보)를 추가할 때 부모테이블의 참조 행(상품번호 또는 주문번호)이 없다면 자식테이블의 행을 추가 할 수 없다. : 주문_상품테이블은 상품번호와 주문번호 중 하나라도 없다면 기본키를 만들 수 없게 되고(두개의 외래키가 합쳐 기본키가 되므로) 기본키가 없어 정보를 식별할 수 없으므로 데이터를 넣을 수 없다. : 예를 들면 게시판의 작성글과 댓글의 관계를 식별관계라고 할 수 있다.(작성글이 없다면 댓글도 없다) 식별관계는 - 복합키 관계 비식별자 부모 테이블(상품, 주문테이블) 기본키가 자식 테이블(주문_상..
백앤드 개발자의 친구 데이터베이스를 알아보려고 한다 [데이터베이스의 특징] 실시간 접근성 : 사용자의 질의에 대하여 즉시 처리하여 응답한다. 계속적인 진화 : 삽입, 삭제, 갱신을 통하여 항상 최근의 정확한 데이터를 동적으로 유지한다. 동시 공유 : 여러 사용자가 동시에 원하는 데이터를 공유할 수 있는 특징을 갖는다. 내용에 의한 참조 : 데이터베이스에 있는 데이터를 참조할 때 투플(tuple)의 주소나 위치가 아닌 사용자가 요구하는 데이터 내용에 따라 참조한다. 데이터 논리적 독립성 : 응용프로그램과 데이터베이스를 독립시킴으로써 데이터 논리적 구조를 변경시키더라도 응용프로그램은 변경되지 않는다. [데이터베이스 관리 시스템] 데이터베이스를 조작하는 별도의 소프트웨어로, DBMS를 통해 데이터베이스를 관리..
Servlet (서블릿) 자바를 사용하여 웹페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양을 말함 Controller 스프링 서버 개발자 입장에서는 시작점과 끝점으로 보이지만, 사실 스프링이 사용자의 요청 (Request)과 응답 (Response)을 처리해 주고 있습니다. 그럼 controller를 사용하지 않은 코드와 controller를 사용한 코드는 무엇이 다른지 코드로 확인해 보겠다. /* Servelte 코드 */ @WebServlet(urlPatterns = "/api/products/*", loadOnStartup = 1) public class AllInOneServlet extends HttpServlet { // 신규 상품 등록 @Override protected void ..
OneToOne에서 새로운 이슈를 맞이했다... 쿼리가 두번 나가는 즉, eager로 로딩이 된다. 바로 OneToOne으로 Lazy 로딩을 사용하려면 따로 설정을 해야한다. 또한 OneToOne관계는 fk를 어디에 두느냐에 따라 성격이 달라져서 잘 생각해보고 정해야한다. 결론부터 말하자면 3가지 처리가 필요하다. nullable이 허용되지 않는 @OneToOne 관계. (ex: Plan과 PlanResult) 양방향이 아닌, 단방향 @OneToOne 관계. (parent -> child) @PrimaryKeyJoin은 허용되지 않음. optional 을 false 로 해두는 값은 CascadeType.PERSIST 와 같이 동작 안한다라고 한다.(null일 수 없다) 위의 사진은 주 테이블에 fk를 둔..
우선 gradle에 swager를 설치해준다. 자료는 mavenrepository(https://mvnrepository.com/)에서 얻었다! implementation group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2' implementation group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2' 우선 jwt를 이용하기 때문에 swagger 관련 페이지를 들어가기 위해 web.ignore에 추가해준다. 그리고 swagger config파일을 만들어 기본 설정들을 해주었다. Docket을 생성하여 api정보, jwt를 사용하기 때문에 securityContext..