목록전체 글 (45)
코더
배경 : dream_stadium 기존 프로젝트에서는 깃허브에 배포까지만 하고 프로젝트를 마쳤으나현업에서는 서버 직접 요청이 아닌 nginx를 통해 8080을 접속하도록 설정을 한다.(아래는 nginx 사용 이유이다.) 장점 :1. 8080,8081과 같이 설정 자유로워 서버에 과부화가 걸리지 않는다2. https 설정과 같이 보안 강화를 할 수 있다. 또한 도메인을 따로 구입하지 않을 것이기에 현재 사용중인 ip값에 https설정을 cerbot을 이용해 추가한다. 과정 : 1. http://탄력적IP:8080/recaptcha 로 접근 방법 sring Boot에 웹 브라우저로 접속하려면 localhost 대신 EC2의 퍼블릭 IP(탄력적 IP)를 써야 한다. ports: - "8080:8080"..
배경 :회사에서는 직접 .pom파일을 verify 한 후 생성한 jar 파일을 윈도우에서는 java -jar myapp.jar같은 형태나 리눅스에서는 sudo systemctl restart myappService같은 형태로 실행을 했다. 이번에는 aws를 이용해 Docker + GHCR + GitHub Actions 으로 배포를 구성했다. (아래는 최종 구조 형태이다.)Mac ↓ git pushGitHub ↓ GitHub ActionsDocker 이미지 생성 ↓GHCR ↓ SSHEC2 ↓Docker Compose ├─ MySQL ├─ Redis └─ Spring Boot (아래는 리눅스에서 service이름으로 jar파일을 mobaxterm에서 돌리는 명령어 순서이다.)sudo nano..
배경 : join fetch에 대해 영속성 관련한 부분에서 헷갈리는 부분이 생겨 정리를 하고자 한다, INNER JOIN → 조인한다 → 연관 엔티티를 같이 가져온다는 보장은 없음JOIN FETCH → INNER JOIN 한다 → + 연관 엔티티도 같이 조회해서 로딩한다 가 기존에 알고 있는 개념이다. 여기서 생긴 궁금증은 그럼 fetch join을 사용하면 되지 뭐하러 refresh()를 사용하냐라는 생각이었다. 하지만 fetch join은 지금 조회하는 시점에 matchSeat도 같이 가져와 라는 의미이지앞으로 db에서 최신 matchSeat을 가져오라는 의미가 아니다 예를 들면 조금 여러가지 예시가 있지만 아래 코드를 살펴보면 이해가 된다. @Transactional public Cus..
배경 : 전의 부하테스트에서 락을 걸지 않아 deadLock이 발생해 오류가 나는것을 확인했다.낙관락,비관락,분산락을 적용 시켜 오류가 없이 예약을 만드려 한다. 과정 : @Versionprivate Long version;을 추가해서 낙관락을 걸어주었다. 문제점 : 오류는 발생하지 않았지만 공유락(s)이 배타락(x)을 가져오는 과정에서 데드락이 발생하였다. 2026-09-22T15:10:03.538+09:00 ERROR 11328 --- [dream_stadium_V2] [o-8080-exec-214] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with pat..
배경 :dream_stadium_V1에서는 예약시스템에서 유저가 예약을 하고 현장에서 쿠폰을 보여줘서 직원이 할인해주는 구조였다.하지만 지금 dream_stadium_V2는 예약시스템에서 유저가 예약과 동시에 쿠폰사용여부를 결정하고 바로 할인이 적용되는 구조이기 때문에 부하테스트를 적용 할 필요가 있었다. 과정 : 일단 맨처음 dbeaver를 통해 데이터를 넣었다.(.csv)파일 passwordEncoder를 통해 넣은값이어야 함으로 email,login_type,nickname,password,user_role,deletedtest001@dream.com,LOCAL,loadtest001,$2y$10$vaR6iQgminOYXNp1Jvvx9uomtzFgct9iWzQAlOX29NvpIEIzBj9R2,CUST..
문제점 : seat이 a가 있고 matchSeat이 이에대해 자식연관으로 A,B,C 일 때a를 삭제하려 하면 matchSeat이 db에 남게 됨으로 seat이 삭제가 안된다.원하는 구조는 matchSeat이 존재한든 안하든 seat이 삭제가 되어야 하기 때문에 수정을 해주었다. 발생한 문제 :2026-09-10T17:22:09.190+09:00 ERROR 5167 --- [dream_stadium_V2] [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing fa..
배경 : UserCoupon을 owner가 만드는 즉시 customer에게 발급하도록 구조를 만들었다.편하게 하려고 그렇게 구조를 만들었으나 그러면 UserCoupon을 만들 때 마다 수천명 혹은 수만명의 사람들에게 UserCoupon을 발급하게 되는 상황이 오게된다. 과정 :public List createUserCoupon( CustomUserPrincipal customUserPrincipal, UserCouponRequestDto dto) { User user = authRepository.findById(customUserPrincipal.getUserId()) .orElseThrow(() -> new BaseException(ErrorCode...
배경 : docker 배포하는 방법은 알지만 자세하게 어떻게 동작하는지에 대한 지식이 부족해 정리가 필요했다. CASE : 1 mysql:3306 차이 만약에 인텔리제이에서 실행을 하고 내 pc에서 테스트 하려면?jdbc:mysql://localhost:3306/dream_stadium_V2으로 일단 localhost로 yml파일 설정을 한 후 docker compose up -d로 일단 docker-compose.yml 을 빌드를 해준다. 그 후 생긴 컨테이너로 start 하면 된다. docker start dream-stadium-V2 즉, 이렇게 하면 docker-compose.yml 통해 빌드 된것을 통해 docker start로 mysql 만 키는것이다. 즉, 인텔리제이도 실행 + 맨 처..