일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- fetch
- execute
- 이진탐색
- 유니크제약조건
- 힙
- exclusive lock
- eager
- 다대일
- 비관적락
- CHECK OPTION
- 데코레이터
- 스토어드 프로시저
- 낙관적락
- BOJ
- 스프링 폼
- 다대다
- 동적sql
- FetchType
- querydsl
- 일대다
- PS
- dfs
- shared lock
- 연관관계
- 연결리스트
- 즉시로딩
- 백트래킹
- JPQL
- SQL프로그래밍
- 지연로딩
- Today
- Total
목록Spring (90)
흰 스타렉스에서 내가 내리지
Spring WebFlux는 Spring 5에서 도입된 비동기 논블로킹 리액티브 웹 프레임워크입니다. 이는 전통적인 Spring MVC와 달리 리액티브 스트림을 사용하여 비동기적이며 논블로킹 방식으로 데이터 흐름을 관리합니다.1. 리액티브 프로그래밍 모델: * 리액티브 스트림(Publisher, Subscriber, Subscription, Processor)을 기반으로 하며, Mono와 Flux 타입을 사용하여 비동기 스트림을 처리합니다. * Mono는 0 또는 1개의 결과를 나타내고, Flux는 0부터 N개의 결과를 나타냅니다.2. 비동기 및 논블로킹: * 요청 및 응답을 비동기적으로 처리하며, 블로킹 호출 없이 리액티브 스트림을 통해 데이터 흐름을 제어합니다. * 높은 동시성을..
@Entity @Getterpublic class Member{ @Id private String id; private String name; @Override public boolean equals(Object obj){ if (this == obj) return true; if (!(obj instanceof Member)) return false; //-- 1 Member member = (Member) obj; if (name != null ? !name.equals(member.getName()) : member.getName() != null) ..
빈번하게 호출되는 API에 대해서, 매번 서비스 로직을 실행하고 응답하는 것은 비효율 적일 수 있다. (응답값이 같다는 가정 하에) API 의 응답 결과를 Elasticache for Redis 를 이용하여 응답 값을 캐싱해주면 어떨까? # API Caching ? - API 의 호출에 따라 캐시를 이용하여, 서버의 부하를 줄이고 API 성능을 최적화 하여 응답시간을 단축시키는 역할을 한다. - 데이터를 메모리에 저장하여, 빠른 검색을 가능하게 하는 기능을 제공한다. # Cache 사용 목적 - DB 로부터 데이터를 조회하는 경우, 동일한 데이터를 반복하여 조회함으로써 불필요한 일을 반복하는 문제가 발생한다. - 캐시를 통해, DB 로부터 반복적으로 데이터를 조회해 오는 일에 대해, 최초 데이터를 조회해..
Redis 설치와 실행 redis 설치 $ brew install redis redis 실행 $ brew services start redis redis-cli 실행 $ redis-cli With Spring Boot * gradle 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-data-redis' * application.yml spring: data: redis: host: localhost port: 6379 password: 1234 * Configuration @Configuration @EnableCaching public class RedisConfig { @Value("${spring.data.redis.host}..
테이블에서 데이터를 랜덤으로 10개 추출해야 하는 상황. JPQL 에서는 LIMIT 키워드를 지원하지 않는다. 그래서 나는 지금껏 Native Query 로 작성해왔다. JPQL 로 할 방법이 없을까 탐색하던 중, JPQL 로 구현하는 방법을 찾았다. 우선, 1. RAND() 부분과 2. LIMIT 부분으로 나누어 구현해야 한다. 1. RAND() JPQL 의 FUNCTION 을 이용한다. 2. LIMIT N JPQL 에서는 LIMIT 키워드를 제공하지 않기 때문에, JPA query method 의 결과를 제한하는 방식으로 구현한다. 이를 위해 Pageable 을 인자로 넘겨주는 방식을 택했다. Pageable 인스턴스는 PageRequest.of() 메서드를 이용하여 생성했다. pageNumber 는..
들어가며 API 하나에 쿼리가 너무 많이 발생하여, 이를 어떻게 하면 한 두번으로 줄일 수 있을까? 하고 8시간 동안 삽질한 후기다. ERD Folder 에는 Term 이 여러개 들어있다. Convert 해서 Folder 의 컬럼에 리스트 문자열로 저장했기 때문에, 직접적으로 연관관계는 없다. Term 은 Comment 들을 가지고 있고, Comment 와 Comment_like 가 1대다 관계이다. 구현하고자 하는 API : 1. FolderId 를 통해 Folder 에 들어있는 TermId 들을 불러온다. 2. 각각의 Term 에 대해서, Term 세부 정보와 Comment 들, 그리고 각각의 Comment 는 Comment_Like 와 Join 하여 좋아요 여부를 불러와야 한다. 처음에 대충 짜본 ..
# findById 를 사용했을 경우 Term termPS = termRepository.findById(requestDto.getTermId()) .orElseThrow(); Member memberPS = memberRepository.findById(memberId) .orElseThrow(); // 북마크 테이블을 업데이트 합니다. Optional termBookmarkOptional = termBookmarkRepository.findByTermAndMember(termPS, memberPS); if (termBookmarkOptional.isEmpty()){ termBookmarkRepository.save(TermBookmark.of(termPS, memberPS)); }else{ termB..
# 큰 그림 클라이언트 → Apache Tomcat (:8080) → Spring Framework → 시큐리티 필터 → Dispatcher Servlet → Controller → Service → Repository → Persistence Context ←→ DB * Dispatcher Servlet은 doPost, doDelete, doPut 등 서블릿의 생명주기를 가지고 있다. 주소를 파싱해서 컨트롤러를 찾아주는 역할을 한다. * @RestControlloerAdvice가 Dispatcher Servlet 단에서부터의 예외처리와 응답을 모두 책임진다. # 작은 그림 # 1. 인증 필터 1. UsernamePasswordAuthenticationFilter (이하 JwtAuthenticationF..
# 1. 필터와 DispatcherType @Slf4j public class LogFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { log.info("log filter init!"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; String req..
Servlet(서블릿)은 자바 언어를 기반으로 하는 웹 애플리케이션 개발을 위한 서버 측 프로그래밍 기술 중 하나입니다. Servlet은 클라이언트의 요청에 동적으로 반응하고, 그 결과를 생성하여 다시 클라이언트에게 반환하는 역할을 합니다. 주로 웹 애플리케이션 서버에서 실행되며, Java EE(Enterprise Edition)와 Jakarta EE(이전의 Java EE)에서 사용됩니다. Servlet의 주요 특징과 개념은 다음과 같습니다: 1. 라이프사이클(Lifecycle): Servlet은 라이프사이클을 가지고 있습니다. 초기화, 서비스 처리, 소멸 등의 단계로 나뉩니다. 이 라이프사이클을 통해 Servlet은 특정 이벤트에 대한 처리를 수행할 수 있습니다. 2. HTTP 프로토콜 지원: 주로 H..