본문 바로가기

Spring

(12)
JPA심화트랙(5) - 객체지향을 곁들인 JPA, QueryDSL 실전 활용법 Spring Data JPA에서 QueryDSL을 사용하기 위해서는 해당 기능을 지원하는 라이브러리를 추가해야 한다. QueryDSL을 사용할 때는 QueryDSL이 제공하는 Predicate를 사용하여 동적 쿼리를 작성하고, Repository에 인터페이스를 작성하여 구현 QueryDSL 기본설정 의존성 추가 후 other-clean 후 compile.Java하여 build/generate에 QEntity 생성된거 확인하기 implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" annotationProcessor "jakarta.annotation..
JPA심화트랙(4) - JPA 유용한 기능들 소개 @Where(Hibernate 6.3 이상은 @SQLRestriction) 특정 Entity를 조회하는 모든 쿼리에 Where 조건을 추가해 주는 어노테이션 Soft Delete로 db에서 지우는 게 아닌 is_deleted 컬럼의 값을 True로 변경하는 경우, Entity를 조회해야 하는 모든 SQL 쿼리문에 WHERE is_deleted = false 구문을 추가해줘야 한다. 이 구문을 @Where(clause = "is_deleted = false")를 이용하면 Member를 조회하는 모든 SQL 쿼리문에 해당 Where 조건이 추가된다. findById(PK)부터 직접 구현한 JPQL, QueryDSL 에도 전부 반영된다. Lazy Loading으로 조회되는 경우에도 반영된다. @Query(va..
JPA 심화트랙(3) - 연관관계 매핑 정리: @OneToOne, @ManyToOne, @OneToMany와 단,양방향 연관관계는 관련이 없다. @ManyToMany를 사용하여 불필요한 update문을 삭제시켜줄 수 도 있다. (단점만 있는건 아님) 양방향 연관관계에서 데이터를 추가/삭제/변경할 때 반드시 연관관계 주인에 대한 변경이 이뤄져야 한다. 양방향 연관관계는 필요에 의해 설정되는거지, 필수가 아니니 단방향 연관관계를 기반으로 코드를 작성한 뒤에 필요하다면 추가해주자. @OneToMany를 써야하는 상황일까? 를 고민해보기, 예를 들어 updatable = false 옵션을 통해 해결 가능한 경우도 있다. ID 참조를 이용한 매핑? 위의 annotation 대신에 다른 entity의 id만 가지고 있는다.(연관관계가 없다고 볼 수 있다..
JPA 심화트랙(2) - Persistence Context(영속성 컨텍스트) 정리: Spring Data Repository 객체의 save(Entity) 메서드를 가급적이면 반환된 Entity 객체를 사용하는 게 좋다. JPQL 쿼리는 PK를 사용하지 않는 repository JPA 문을 사용 시에 flush()가 사용되므로, 1차 캐시와 db 간에 데이터차이가 발생하는 것에 주의하자. clear()를 사용하여 이 불일치를 해결하면 좋다. 영속성 컨텍스트는 JPA에서 제공되는 논리적 구조로, 영속 상태의 엔티티를 관리하는 데 사용된다. JPA는 영속성 콘텍스트를 활용하여 주요 캐시, 식별성 보장, 쓰기 지연, 그리고 변경 감지(더티 체킹)와 같은 다양한 기능을 제공한다. (이 기능은 JPA의 무결성을 보호하는 데 목적이 있지만, 성능 저하의 원인 중 하나가 될 수도 있다.) 영..
JPA 심화트랙(1) - ORM의 필요성 결론: ORM은 코드 작성을 개발자 친화적으로 만들어주었지만, 약간의 성능하향과 제약이 걸릴 확률이 높아진다. 그렇기 때문에 적절한 상황에서 사용해야 한다. 필기 내용: Spring Boot 어플리케이션을 개발할 때 객체지향 프로그래밍 언어를 사용 영속성을 구현하기 위해 MySQL, PostgreSQL과 같은 관계형 데이터베이스(RDB)를 함께 사용 애플리케이션의 크기가 커질수록 SQL 쿼리문이 많아지게 됐고, 다음과 같은 문제들이 부각되기 시작했다. 반복적인 CRUD 코드로 인한 SQL쿼리문의 반복된 구조로 반복적인 작성이 이루어짐 SQL 쿼리문이 문자열로 작성되면서 컴파일 시점에 에러를 발견하기 어려워짐 RDB 스키마 정보가 수정되는 등의 변경이 생기면 작성되어 있던 SQL 쿼리문에 해당 변경을 모두..
Spring boot : redis 기본 설정 redis 사이트에서 windows 사용 시 ubuntu로 설치를 해야 하기 때문에 ubuntu version을, mac 사용 시 macOs 버전을 설치해 주면 된다. build.gradle implementation 'org.springframework.boot:spring-boot-starter-data-redis' application.yml spring: redis: host: localhost // 배포하게 된다면 배포된 서버의 endpoint로 port: 6379 password: 필요는 없겠지만, 만약 비밀번호를 설정해준다면 작성 RedisConfig.java @Configuration public class RedisConfig { // Redis 호스트 및 포트 @Value("${spri..
WebSocket - 실시간 양방향 소통 Websocket의 활용처 실시간 채팅, 실시간 알림설정, 실시간 모니터링, 문서의 동시편집을 구현하는데 사용한다. HTTP 프로토콜 vs WebSocket windows 개발자 블로그를 참고해보면 알 수 있는데, WebSocket이 무조건 HTTP 프로토콜의 상위호환이 아닌, 각자의 장단점이 있기에 잘 보고 적절한 종속성을 사용하여야 한다. WebSocket 기본 setting build.gradle에 implementation 'org.springframework.boot:spring-boot-starter-websocket' WebSocketConfig.java @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig imp..
[Spring] 인프런 - 스프링 입문 스프링부트(3) 정적 콘텐츠 정적 콘텐츠는 동적으로 생성되는 것이 아니라 미리 만들어진 HTML, CSS, JavaScript, 이미지 파일 등을 의미한다. 이는 서버에서 바로 제공되는 것으로, 서버 측에서 어떠한 연산 없이 바로 클라이언트에게 전달된다. 정적 콘텐츠의 의미 웹사이트를 방문하면 웹 브라우저가 서버로부터 해당 페이지의 데이터를 요청하게 된다. 이때, 동적 콘텐츠는 요청 시점에 서버에서 생성되지만, 정적 콘텐츠는 이미 서버에 미리 저장되어 있어 즉시 클라이언트에게 제공된다. 이것은 사용자 경험을 향상하고 웹 사이트의 성능을 향상하는 데 중요한 역할을 한다. 예를 들어, "localhost:8080/hello-static.html"라는 특정 URL을 요청하면, 서버는 스프링 부트는 “resources/stat..