728x90
반응형
SMALL

분류 전체보기 220

Transaction, Auto Commit, Rollback, Lock

DB를 사용할 땐 반드시 이해하고 있어야 하는 키워드인 '트랜잭션'은 이것 저것 다양한 내용이 참 많은듯하다. 우선 트랜잭션이란 DB에 어떤 작업을 하기 위해선 이 트랜잭션이 살아있는 주기동안에 일어나야한다. 즉, SELECT, UPDATE, INSERT 등 모든 DB에 대한 행위는 트랜잭션이 필요하고 이 트랜잭션이라는 단위가 시작되는 순간부터 종료되는 시점 사이에 대한 내용을 적어보자한다.  Auto Commit오토 커밋은 트랜잭션이 종료될 때 자동으로 커밋을 수행하는 것을 말한다. 커밋은 DB에 어떤 행위를 수행한 후 그 행위를 DB에 적용하는 것을 말하는데 이 커밋을 수행하지 않으면 변경사항이 DB에 적용되지 않는다. 그리고 그 변경사항에 대한 적용을 자동으로 해주는 것이 오토 커밋이다.  참고로 ..

Spring + DB 2023.11.30

java.lang.OutOfMemoryError: Java heap space

결국은 한번 만나버린 OutofMemoryError. 회사에서 자바로 플러그인 개발을 하고 사용을 쭉 하다가 이런 에러가 생겼다. 우선, 어떻게 해결할지 난감해서 구글링을 계속 하면서 해결해보고자 했는데 아무리 해도 안된다. 처음 해본 방법은 다음과 같이 실행 명령어에 최대 크기를 늘리는것. mvn clean package -DskipTests -DactivatedProperties=prod -Dspring-boot.run.jvmArguments="-Xmx8192m" 그러나 해결되지 않았다. 왜 해결되지 않는지 모르겠는데 왜 해결되지 않는지 구글링을 해보니 이러이러한 이유가 있다고 한다. 애플리케이션 실행에만 영향을 주는 옵션, 이 애플리케이션을 구동하는 JVM 자체에는 영향을 주지 않는다. (JVM의 ..

Troubleshooting 2023.11.30

Spring Boot 3.1.5에서 QueryDSL 설치하기

Spring Data JPA와 같이 사용하면 막강의 쿼리 작성을 할 수 있는 QueryDSL을 프로젝트에 설정하는 방법을 기록하고자 한다. 하도 버전에 따라 설치하는 방법이 달라져서 스프링 부트 3.1.5, Gradle에서 설치하는 방법을 작성했다. (아마 3.x.x라면 다 이 방법으로 하면 되지 않을까 싶다) 버전 정보 Software or Framework Version Spring Boot 3.1.5 QueryDSL 5.0.0 Gradle 8.4 시작하기 우선, build.gradle 파일에서 아래와 같은 dependencies를 추가해준다. build.gradle implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcesso..

[JPA] OSIV (Open Session In View)

JPA를 사용할 때 "Open Session In View"라는 게 있다. 이 녀석이 은근 골치가 아픈 녀석인데 Spring Boot와 JPA를 같이 사용할 때 서버를 실행해 보면 (OSIV 관련 어떠한 작업도 하지 않았을 때) 이런 경고 문구가 노출된다. 2023-11-16T08:31:26.467+09:00 WARN 76673 --- [ restartedMain] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.op..

React에서 대시보드로 사용할만한 라이브러리 'nivo'

회사 프로젝트에서 Pie Chart와 일 별 데이터 카운트를 보여줄 대시보드가 필요했다. 찾아봤는데 좋은 라이브러리가 있어서 공유겸 공부한 것을 까먹지 않기 위해 작성해보고자 한다. 우선 라이브러리 이름은 'nivo'이다. https://nivo.rocks/ Home | nivo nivo.rocks Install 우선, 다음 명령어로 nivo의 코어가 되는 패키지를 내려받아야 한다. npm i @nivo/core 그리고, 원하는 차트별로 패키지를 내려받으면 된다. 예를 들어 내가 파이차트를 사용하고 싶다면 다음처럼 명령어를 입력하자. npm i @nivo/pie 물론, 매뉴얼에서 친절하게 다 알려준다. 사이트가 굉장히 모던하면서 매뉴얼도 극강으로 사용자 경험이 좋다. 들어가보면 여러 차트를 사용할 수 ..

React 2023.11.15

[JPA] 페치 조인의 한계와 한계 돌파

페치조인의 한계 JPA에서 정말 정말 중요한 페치 조인도 역시 만능은 아니고 컬렉션 데이터를 페치 조인할 때 페이징이 불가능하다. ToMany 관계를 페치 조인할 때라고 말하는 것과 동일한데, 결론은 페치 조인을 사용할 때 페이징이 불가능하다. 정확히 말하면 페이징이 불가능한것보단 하이버네이트가 메모리 상에서 페이징을 해주는데 이는 절대로 사용해선 안된다. 그냥 그러니까 ToMany 관계를 페치 조인할 땐 페이징이 불가능하다고 생각하면 된다. 그래서 이를 해결해야 하는데, 우선 다음과 같은 쿼리가 있다. public List findAllWithItem() { return em.createQuery("SELECT DISTINCT o " + "FROM Order o " + "JOIN FETCH o.memb..

[Spring/JPA] 컨트롤러에서 Entity를 반환할 때 생기는 문제점

JPA와 Spring을 공부하던 중 REST API를 통해 데이터를 주고 받아야하는 상황이 빈번하게 있을텐데 이 때 컨트롤러에서 엔티티를 반환하는 일이 생기면 절대 안된다. 많은 문제가 있지만, 그 중에서도 어떤 문제가 있냐면, 엔티티의 변경이 생겼을 때 API 스펙까지도 아예 변경되어야 하기 때문이다. 또한, 엔티티는 지연 로딩 전략을 사용할텐데 지연 로딩 전략을 사용한 상태에서 이를 처리하지 않는 경우 Response를 제대로 할 수 없거나 성능에 문제가 생기거나 불필요한 Response data가 생긴다. 예시를 살펴보자, 우선 컨트롤러가 엔티티를 다루는 코드를 살펴보자. @RestController @RequiredArgsConstructor @RequestMapping("/api/v1/") pu..

[JPA] 변경감지와 Merge

데이터베이스에서 관리하고 있는 어떠한 데이터를 변경(수정)할 때 JPA는 어떻게 처리할까? JPA공부를 좀 해보니 영속성 컨텍스트에 관리되고 있는 엔티티는 트랜잭션이 커밋을 하는 시점 (다른 말로 영속성 컨텍스트가 닫히는 시점)에 flush()를 호출하고 그 때 변경된 내용이 있으면 변경 감지(dirty checking)를 통해 update 쿼리가 나간다. 그럼 영속성 컨텍스트가 더는 관리하지 않는 준영속 엔티티는 어떻게 변경할까? 방법은 두가지가 있다. - 영속성 컨텍스트가 다시 관리하게 한 후 변경 감지를 사용 - 병합(merge)를 사용 변경 감지 🟢 @Transactional void update(Item itemParam) { //itemParam: 파리미터로 넘어온 준영속 상태의 엔티티 Ite..

[Spring/Spring Data JPA] @Transactional

Spring과 Database를 같이 사용할 때 무조건 사용하게 되는 애노테이션 @Transactional. 물론 반드시 사용해야만 하는 건 아니지만 다른 방법을 쓸 필요가 없이 너무나 편리하게 트랜잭션을 시작하고 끝낼 수 있기에 안 사용할 이유가 없다.  이렇게 애노테이션 하나로 트랜잭션을 시작하는 것을 '선언적 트랜잭션'이라고 한다.  이 애노테이션은 클래스, 메소드 단위로 붙일 수 있고 더 나아가 인터페이스에도 붙일 수 있다. 그러나 인터페이스에 붙이는 건 공식 매뉴얼에서도 권장하지 않는 방식이고 클래스 또는 메소드 단위로 사용하자. 우선 데이터베이스에 어떤 작업을 하려면 반드시 트랜잭션이 필요하다. 트랜잭션은 일반적으로 다 아는 어지간한 데이터베이스에서 기본값으로 모든 행위에 대해 트랜잭션이 열린..

Spring + DB 2023.11.12

Process ID가 보이지 않는 Process 종료하기

서버에 Docker를 사용해서 Containerized app을 실행중이었는데, 어떤 이유에선지 실행중인 컨테이너가 다 내려가는 이상한 일이 발생했다. 그래서 다시 컨테이너를 마운트하는데 내가 사용하려는 포트를 이미 사용중이라고 나온다. 6e4b0ce8199e3364a9a979e07a611ae912aa0cad06fac0508d2c32df8a4a83d7 docker: Error response from daemon: driver failed programming external connectivity on endpoint katech-web (e2869131fb101ad044163633db6a1f72a8057a6bb39f9e42ce2f6684f1ac0cf3): Error starting userland p..

Troubleshooting 2023.11.01
728x90
반응형
LIST