전체 글 63

스프링 심화 대규모 AI 시스템 설계 프로젝트 - Starting Assignments

API 명세서https://teamsparta.notion.site/API-f7da2a7b7fe64f9c9eeb8616fd15e9f4 API 명세서 | NotionMade with Notion, the all-in-one connected workspace with publishing capabilities.teamsparta.notion.site 테이블 명세서https://teamsparta.notion.site/fa7f938fb7554cf884904d99c95c8ca5 테이블 명세서 | Notion기본 감사 로그teamsparta.notion.site ERD 명세서 인프라 설계서

프로젝트 2024.09.25

AI 검증 비즈니스 프로젝트 회고

프로젝트 소개GEMINI API를 기반으로 가게 사장님들의 가게 설명 작성을 도와주는 주문 서비스 개발 나의 개발 파트AI API 개발User API 개발Payment API 개발회원가입/로그인 로직 구현Redis 사용 캐싱 구현 기술 스택 백엔드 아키텍처 Liked좋은 팀원들에게 많이 배운 점팀원들과 잘 분업화 해서 주요 기능을 모두 완성한 점Spring Security & JWT 이용한 인증, 인가 로직을 구현해본 점Redis를 이용한 로그인 시 캐싱 구현해본 점PR시 코드 리뷰 해야 merge할 수 있도록 한 점 Lacked도전 기능 전부 구현해보지 못한 점Querydsl을 활용해보지 못한 점 LearnedJpaAuditing + BaseEntity를 사용한 Auditing Fields 처리soft..

프로젝트 2024.09.25

24.09.12 TIL - 프로젝트 하면서 배운 팁

오늘 배운 것패키지 구조Service에서 어떤 것 호출하는지application.yml 파일 분리 패키지 구조이전에 프로젝트를 진행할 때 패키지 구조를 각 엔티티별로 나눴다.  각 엔티티 패키지가 있고 해당 패키지 안에 controller, service, repository 패키지 등이 있는 구조였다.  이렇게 나눈 이유는 각자 맡은 도메인별로 개발을 진행했기 때문이였다.  그리고 이전에 다른 프로젝트를 진행할 때 Controller나 Dto 등이 너무 많아지면 한 패키지에서 찾기 어려웠다.  그래서 각 도메인별로 모아두는 것이 보기 편해서 이렇게 진행하였다.  아래 그림처럼 Dto가 너무 많아 찾기가 어려웠다.   그런데 패키지 구조를 도메인 별로 나누는 것보다 계층별로 나누는 것이 좋다고 한다.  ..

TIL 2024.09.13

24.09.11 TIL - MSA Service 공통 처리

오늘 배운 것Dependency 추가BaseEntity 추가  개요MSA 형태의 프로젝트를 진행하는데 각 서비스에서 설정해야 하는 것이 많이 있다.  이때 공통적으로 각 서비스에 설정해야 하는 것들이 있다.  이런 공통적인 것들을 작성해 봤다.  각 서비스에서 추가해야 하는 것들이 어떤 것들이 있는지 알아보자.   Dependency 추가우선 추가한 Dependency들은 다음과 같다. Spring WebLombokSpring SecuritySpring Data JPAPostgreSQL DriverValidationSpring Boot ActuatorZipkinPrometheusEureka Discovery ClientOpenFeign위의 dependency는 Spring Initializer에서 추가하..

TIL 2024.09.12

24.09.10 TIL - 같은 타입 Bean 여러 개

오늘 배운 것같은 타입 Bean이 여러 개라면해결 방법해결 방법 우선 순위 같은 타입 Bean이 여러 개라면같은 타입의 Bean이 여러 개인 상황부터 보자. 먼저 인터페이스가 있는 것이다. public interface Product{ ...} 그리고 이 인터페이스를 구현한 클래스가 2개 있는 것이다. @Componentpublic class KoreaProduct implements Product{ ...} @Componentpublic class JapanProduct implements Product{ ...} 이 구현 클래스들에 @Component를 붙여 Bean으로 각각 등록한 것이다.  두 구현 클래스 모두 Product 타입으로 같은 타입의 클래스를 Bean으로 등록하는 것은 문제가 없다. ..

TIL 2024.09.10

24.09.09 TIL - Bean 수동 등록

오늘 배운 것Bean 자동 등록이란?Bean 수동 등록이란?Bean 수동 등록 방법 Bean 자동 등록이란?@Component를 class에 붙이게 되면 해당 class는 Bean으로 등록이 된다. Component Scan에 의해 @Component가 붙은 class들을 자동으로 scan해 Bean으로 등록해주기 때문이다. 일반적으로는 @Component를 사용해 Bean을 자동 등록하는 것이 좋다. 프로젝트 규모 커질수록 등록할 Bean이 많아지기 때문에 자동 등록이 더 편리하다. 비즈니스 로직과 관련된 클래스들은 수가 많아 @Controller, @Service와 같은 애너테이션들을 사용해서 자동 등록해 관리하면 개발 생산성에 유리하다.  흔히 알고 있는 @Controller, @Service, @..

TIL 2024.09.10

24.09.06 TIL - CSRF

오늘 배운 것CSRF란?CSRF 상황CSRF 공격 예시CSRF 공격 방지 방법 CSRF란?CSRF는 Cross-site request forgery의 약자로 사이트 간 요청 위조라는 의미이다.  웹 애플리케이션의 취약점을 이용해 사용자가 의도하지 않은 요청 보내도록 하는 공격 기법이다.  공격자는 사용자가 인증된 상태를 악용해 사용자가 원하지 않는 행동 수행하게 만든다.  공격자가 인증된 브라우저에 저장된 쿠키의 세션 정보를 활용해 웹 서버에 사용자가 의도하지 않은 요청 전달하는 것이다. CSRF 공격은 생성된 요청이 사용자의 동의를 받았는지 확인할 수 없는 웹 애플리케이션의 CSRF 취약점을 이용한다.  공격자의 요청이 사용자의 요청인 것처럼 속이는 공격 방식이다.   CSRF는 사용자가 인증한 세션에..

TIL 2024.09.08

24.09.05 TIL - Effective Java Item 63

오늘 배운 것Effective Java Item 636️⃣3️⃣ Item 63 : 문자열 연결은 느리니 주의하라📌 목차문자열 연결 방법 1문자열 연결 방법 2성능 차이1️⃣ 문자열 연결 방법 1문자열을 연결하는 방법에는 문자열 연결 연산자 (+)가 있다. 이것은 여러 문자열을 하나로 합쳐주는 편리한 수단이다. String firstName = "minjae";String lastName = "kim";String name = firstName + lastName;하지만 문자열 연결 연산자는 아래와 같은 경우에 사용해야 한다. 한 줄짜리 출력 값작고 크기가 고정된 객체의 문자열왜냐하면 문자열 연결 연산자를 이용해 여러 문자열을 연결하면 성능 저하가 생기기 때문이다. 문자열은 불변이라 두 문자열을 연결할 ..

TIL 2024.09.08

24.09.04 TIL - Bean Validation

오늘 배운 것validationBean Validation 종류Bean Validation 적용Validation 예외 처리 Validation이란백엔드 서버에서 입력 값을 검증해야 할 때가 있습니다.  예를 들어 Java에서는 null 값이 있어서 입력 값으로 null 값이 들어왔을 때 제대로 된 처리를 하지 않으면 NullPointException이 발생합니다.  이런 NullPointException을 예방하기 위해서 Validation 즉 검증 과정이 필요하다.  또 비즈니스 요구사항으로 'id는 소문자, 숫자로만 구성되고 6~10자로 구성되어야 한다' 이런 것이 있을 수 있습니다.  이럴 때 입력 값으로 들어온 id가 비즈니스 요구 사항에 맞는지 검증 과정이 필요하다.  이전에는 이런 검증은 프..

TIL 2024.09.08

24.09.03 TIL - Spring Security Login with JWT

오늘 배운 것Spring Security 설정Spring Security Config 설정UserDetailsService 인터페이스 구현UserDetails 인터페이스 구현JWT 인증 처리 필터 생성JWT 인가 처리 필터 생성@AuthenticationPrincipal@Secured 개요Spring Security의 기본 설정으로는 세션 기반 로그인이다.  로그인이 성공하면 세션 ID를 반환하는 방식으로 진행이 된다.  따라서 JWT 기반으로 로그인을 진행하려면 커스텀을 좀 해야 한다.  JWT를 기반으로 로그인을 하려면 어떻게 해야 하는지 보자.  Spring Security 설정Spring Security를 사용하려면 역시 build.gradle에 추가해줘야 한다. // Securityimpleme..

TIL 2024.09.08