728x90
로그 파이프라인 구축 도구 정하기로그 수집 도구`Log Stash` : 많은 레퍼런스와 안정성 보장, JVM 기반으로 리소스 사용량 높음`Fluentd` : 리소스 사용량 높은 편`Vector` : `Log` 뿐 아니라 `Metrics`, `Tracing` 지원`Promtail` : `Loki` 와 통합이 잘 되지만, `Log` 만 지원하고 단순 처리만 가능따라서 `Vector` 로그 저장 도구`ES` : 리소스 사용량을 감당할 수 없음`Loki` : 기존 `Grafana` 와 통합 쉬움따라서 `Loki` 이렇게 프로젝트 팀원 분이 결정해 주셨다. 👍👍(나도 앞으로 기술을 선택할 때, 현재 상황에 맞춰서 장단점을 보고 골라야겠다고 다짐했다.) 그럼 이제 `Loki` 로 로그를 저장하고, `Vector..
전체 아키텍처 개요그리고 이 시스템은 다음과 같은 특징을 가진다.JWT 기반 토큰 인증 (`Access Token` + `Refresh Token`)일반 로그인과 소셜 로그인 통합 지원게스트 사용자 지원 및 회원 전환 시 데이터 이관쿠키 기반 토큰 저장으로 XSS 공격 방어Redis 를 활용한 Refresh Token 관리핵심 컴포넌트 구조1. PrincipalMember - 통합 사용자 정보 객체public class PrincipalMember implements UserDetails, OAuth2User { private final Member member; private final Map attributes; // 일반 로그인용 생성자 public PrincipalMe..
세션과 JWT 의 차이세션 Stateful- 로그인 성공 시, 인증 정보를 서버 세션(`HttpSession`)에 저장- 클라이언트 요청 시, 세션 ID 를 쿠키로 전송- 서버는 세션 ID 로 인증 정보를 조회해 로그인 상태 유지 장점: 구현이 간단하고, Spring 에서 기본적으로 지원한다.: 서버가 사용자 인증 상태를 관리하기 때문에 비교적 보안성이 높다.단점: 서버가 상태를 유지해야 하므로 확장성이 낮고, 분산 환경에 부적합하다.: 서버 간 세션 동기화가 필요하다.: 인증 정보가 많아질수록 서버 리소스 부담이 증가한다. JWT Stateless- 로그인 성공 시, JWT 토큰 생성하여 클라이언트에게 전달- 클라이언트 요청 시, JWT 토큰을 헤더 or 쿠키에 담아 전송- 서버는 JWT 의 서명을 검..
나만의 메모장 프로젝트 - 트러블슈팅로그인 vs 게스트 세션 관리문제로그인한 사용자와 로그인하지 않은 사용자를 모두 지원해야 하는 게 목표였는데,세션에서 사용자 정보를 꺼내는 방식을 고민하게 되었다.해결로그인 시: session.setAttribute("loginMemberId", loginMember.getId());게스트 진입 시: session.setAttribute("guestId", UUID.randomUUID().toString());메모 저장 시: 두 값 중 존재하는 값을 기준으로 writerId 식별 후 저장 유효성 검사 메시지 미출력문제@NotBlank 등 유효성 검사가 동작했지만, 타임리프에서 메시지가 보이지 않았다.해결@GetMapping 에서도 @ModelAttribute 를 사용..
트랜잭션 옵션value, transactionManager기본으로 등록된 트랜잭션 매니저를 사용할 때는 생략하면 되지만,사용하는 트랜잭션 매니저가 둘 이상이라면 트랜잭션 매니저의 이름을 지정하여 구분해야 한다.public class TxService { @Transactional(value = "memberTxManager") public void member() {...} @Transactional("orderTxManager") public void order() {...}} rollbackFor / noRollbackFor체크 예외가 발생하면 커밋되지만, 추가로 예외를 지정하면 해당 예외를 롤백할 수 있다.@Transactional(rollbackFor = Exception.class)E..
Querydsl 소개- 동적 쿼리 문제를 완벽하게 해결한다.- 쿼리 문장에 오타가 있어도 컴파일 시점에 오류를 막을 수 있다.- 메서드 추출을 통해 코드를 재사용할 수 있다. 초기 설정build.gradle 파일에 다음 설정을 추가해 준다.implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'annotationProcessor "com.querydsl:querydsl-apt:$ {dependencyManagement.importedProperties['querydsl.version']}:jakarta"annotationProcessor "jakarta.annotation:jakarta.annotation-api"annotationProcessor "jakar..
스프링 데이터 JPA 소개- JPA 를 편리하게 사용하도록 도와주는 프레임워크이다.- 리파지토리의 구현 클래스 없이 인터페이스만으로 개발이 가능하다.- 기본 CRUD 기능과 페이지 기능도 자동 제공된다.- 쿼리 메서드 기능을 제공한다.- 동적 SQL 을 해결하기 어렵다. 초기 설정build.gradle 파일에 다음 설정을 추가해 준다.implementation 'org.springframework.boot:spring-boot-starter-data-jpa'(JPA 라이브러리에 JDBC 라이브러리도 함께 포함되어 있기 때문에, JDBC 의존관계를 제거해도 된다.) `main` 과 `test` 의 application.properties 에 다음 설정을 추가해 준다.logging.level.org.hibe..
JPA 소개- SQL, 데이터 중심의 설계에서 객체 중심의 설계로 전환할 수 있다.- 기존의 반복 코드, 기본적인 SQL 문도 JPA 가 직접 만들어 실행한다.- PK 기반이 아닌 SQL 문은 직접 작성해야 한다.- 동적 SQL 을 해결하기 어렵다.- EntityManger 을 주입받아 동작한다.- JPA 를 통한 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다. > 참고 - 스프링 부트가 JPA 설정에 따라 EntityMangerFactory 를 생성하고, 이를 통해 EntityManager 를 스프링에 주입할 수 있도록 해준다. 초기 설정build.gradle 파일에 다음 설정을 추가해 준다.implementation 'org.springframework.boot:spring-boot-starter..