일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Google OAuth
- nestjs
- Volatile
- 일급 객체
- spring security
- middleware
- Dependency Injection
- lombok
- factory
- OAuth 2.0
- java
- builder
- 일급 컬렉션
- Spring
- synchronized
- Today
- Total
목록SPRING (20)
HJW's IT Blog

1. 들어가며Spring Batch 를 활용해 뉴스 기사를 외부 API 에서 수집하고, 이 기사는 관심사 별로 분류하여 DB에 저장하는 과정에서의 시행착오를 담은 글이다. 2. 문제 파악기사 (Article)와 관심사 (Interest) 는 다대다 관계이다. 그렇기 때문에, 중간 테이블인 ArticleInterest 를 활용하여 저장하고자 하였다. Batch 의 전체 프로세스는 다음과 같았다.Reader :DB에서 Keyword 를 읽는다Keyword는 Interest 와 연결된 단어이다.기사를 조회할 때, Keyword 를 기반으로 조회한다Processor :각 Keyword 는 여러 Interest 와 연관되어 있을 수 있고, 하나의 Interest 는 여러 Keyword를 가질 수 있기 때문에, 이..

들어가며어플리케이션의 통합 테스트 코드를 작성하다 이해하기 힘든 상황을 마주쳤다.INSERT INTO users (id, created_at, updated_at, username, email, password, profile_id) VALUES ('00000000-0000-0000-0000-000000000001', NOW(), NOW(), 'user1', 'user1@example.com', 'encrypted-password', null); INSERT INTO users (id, created_at, updated_at, username, email, password, profile_id) VAL..

이전 포스팅에서 OAuth2.0 과 JWT 를 이용한 로그인 기능을 구현하였다. 이제 여기에 form login 방식을 추가하여 두가지 방식의 로그인을 가능하게 만들어 볼 것이다.UserDetails 와 UserDetailsServiceSpring Security 의 Form Login 을 이해하기 위해선, Spring Security 가 제공하는 UserDetails 객체와 UserDetailsService 를 이해하고 넘어가야 한다. 한번 UserDetails 를 살펴보자public interface UserDetails extends Serializable { Collection getAuthorities(); String getPassword(); String getUsername..

이번 사이드 프로젝트를 진행하며, OAuth 2.0 에 더불어 JWT 인증 시스템을 채택하여 진행하였다.OAuth 2.0 FlowClient 의 로그인 요청 : GET /api/oauth2/authorize/{provider} 로 요청을 보낸다서버는 돌아올 콜백 URI 를 포함한, 제공자에 맞는 URL 로 리다이렉션을 한다클라이언트가 제공자의 페이지에서 승인을 한다제공자는 콜백 URI 을 사용해 서버의 엔드포인트에 인증 코드를 포함해 보낸다서버는 해당 인증 코드를 가지고 다시 제공자에 Token요청을 한다Token 이 유효하다면, 제공자는 미리 명시된 (ex. email, providerId) 데이터를 서버로 보내준다.Spring Security 를 사용하게되면, 2 ~ 5번의 과정을 자동으로 진행해 준..

1. 엔티티 리스트를 조회했는데 프록시가 반환되었다JPA 를 다루며 쿼리 최적화를 위해 디버거와 로그를 통해 분석중 이었다. 그때, `Channel` 리스트를 조회해야 하는 쿼리의 반환값이 이해하기 힘들었다. 4개는 실제 객체, 2개는 프록시 객채였던 것이다. `Lazy Loading` 으로 불러온 객체들도 아닌, SimpleJpaRepository 의 findByIdIn 을 사용해 불러온 객체들 중 프록시가 포함되어 있다는 것이 이해가 되질 않았다. 아래는 이 현상을 분석하기 위해 Hibernate ORM 공식 문서와, 1차 캐시를 뜯어보며 분석해본 결과이다. 2. 세션과 영속성 컨텍스트 [공식문서]2.9.2. Natural Id APIAs stated before, Hibernate provides..

0. N + 1 이란Spring Data JPA 에서 연관관계가 있는 엔티티를 조회할 때, Lazy Loading 을 활용하여, 실제 데이터가 필요한 시점까지 연관 엔티티의 조회를 미룰 수 있다. 이는 양날의 검과 같다. 최적화를 하는 동시에 성능에 지대한 영향을 미칠 수 있다. 단편적인 예시가 바로 N + 1 문제이다. 한번의 부모 엔티티 조회 후, 각 자식 엔티티를 개별적으로 조회하는 비효율적인 쿼리 실행 문제를 두고 부르는 말이다. @Entitypublic class User { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "user", fetch = FetchType.LAZY) ..

0. 들어가며 JPA 를 사용하며 SQL문을 보기 위해 보통 applicaion.yml 의 spring.jpa.show-sql = true 설정을 쓸 것이다. 하지만.. 너무 가독성이 떨어진다. 디버깅 하기도 어렵고 어떤 쿼리가 발생하는지 읽기도 힘들다. 이번 포스팅에선 이러한 Hibernate 가 자동으로 찍어주는 쿼리 대신 P6Spy 라이브러리를 이용한 쿼리 커스터마이징에 대해 다루겠다. 1. 적용 전Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ where user0_.name=? 정말 읽기 힘들고 가독성이 떨어지는 코드가 발생한다. 물론, format-sql = ..

들어가며DispatcherServlet은 Spring의 핵심 요소중 하나이다. DispatcherServlet은 Spring의 프론트 컨트롤러로서, 모든 웹 요청의 진입점 역할을 담당한다. HTTP 요청을 가장 먼저 받아 적절한 컨트롤러로 위임하는 것이 주 역할이다. DispatcherServlet과 Spring의 동작 과정을 잘 이해하기 위해선 프론트 컨트롤러 패턴의 개념과 장점에 대해 확실하게 짚고 넘어가야 한다.1. 초기 웹 어플리케이션 개발의 문제점초기 웹 어플리케이션 개발에선, 각 요청에 대해 개별적으로 처리하는 서블릿 혹은 JSP 를 작성하는 것이 일반적이었다. 한번 JSP 코드를 한번 보고 넘어가자. members = memberRepository.findAll();%>메인 i..

빈 생명주기 콜백빈 생명주기 콜백 시작어플개발을 하다 보면, 어플리케이션 시작 시점에 특정 서비스나 리소스를 준비하거나, 연결해둔 뒤에 어플리케이션 종료 시점에 이를 깔끔하게 정리하는 로직이 필요한 경우가 있다.예를 들어DB Connection Pool 연결 : 어플리케이션 구동 시점에 미리 연결 풀을 구성해두면 빠른 DB 연동이 가능하다외부 서비스와의 Socket 연결 : 초기에 연결을 맺어 두었다면, 어플리케이션 종료 전에 연결을 해제해야 정상적인 종료가 가능하다.이와 같이 시작할때, 준비, 끝날때 정리 는 매우 흔한 요구사항이다. 그렇다면 우리는 스프링 빈이 언제 준비 되는지와, 어떤 시점에 초기화 / 정리 로직을 호출할 수 있는지를 명확하게 알아야다음과 같은 예시를 보자 public class N..

컴포넌트 스캔 / Dependency Injection컴포넌트 스캔과 의존관계 자동 주입이전 포스팅 까지는, Spring Bean 등록시, @Bean 을 사용해 설정 정보에 직접 등록 해 주었다. 하지만, 프로젝트 규모가 커질 수록, 일일이 등록하기도 힘들고, 누락하는 문제도 발생한다. 이번 포스팅에선, 자동으로 Spring Bean 을 등록하는 방법에 대해 알아보자우선, AutoAppConfig.java 파일을 생성.package hello.core;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframew..