728x90
1. EC2 생성, 보안 그룹 설정 + 자동화 쉘 스크립트 2. RDS PostgreSQL 생성, EC2 에 Redis 설치3. GitHub Actions 로 자동 배포4. 도메인 연결하기5. Nignx 무중단 배포 RDS 인스턴스 생성하기RDS`AWS Console` > `Aurora and RDS` > `데이터베이스 생성` (아래는 내가 설정한 방식이다. 참고만 바람!)- 생성 방식: 표준 생성- 엔진 옵션 : `PostgreSQL` (`Aurora` 를 선택하면 비용이 발생한다 ... !! `PostgreSQL` 을 선택해야 프리티어에서 무료로 사용할 수 있다.)- DB 인스턴스 Id : `notepad-db`- DB 이름 : `notepad_db`- 마스터 사용자 이름 : 기본값 `postgre..
1. EC2 생성, 보안 그룹 설정 + 자동화 쉘 스크립트 2. RDS PostgreSQL 생성, EC2 에 Redis 설치3. GitHub Actions 로 자동 배포4. 도메인 연결하기5. Nignx 무중단 배포 AWS 배포하게 된 이유우선 기존 프로젝트를 간단하게 `render` 에서 배포하였지만, 무료 사용 기간(한 달)이 지나 `AWS` 로 재배포하기로 마음먹었다!! 메모장 프로젝트는- `PostgreSQL`- `Redis`를 사용하고 있다. `PostgreSQL`과 `Redis` 를 `AWS RDS` 로 사용하여 `AWS` 가 관리하도록 할지, `EC2` 서버 내부에 직접 설치할지 고민이었다. 1. `RDS` 사용하는 경우 : `AWS` 가 자동으로 백업, 장애복구, 보안패치, 스케일링 관리..
로그 파이프라인 구축 도구 정하기로그 수집 도구`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..