전체 글

심플하고 차분하게

    [이커머스 프로젝트] 멀티 모듈 생성하기

    [이커머스 프로젝트] 멀티 모듈 생성하기

    | 멀티 모듈 생성하기 - 모르는게 많은 개발자 포스팅 을 많이 참조하였습니다. [1] Root 의 build.gradle을 아래와 같이 작성한다. buildscript{ ext { springBootVersion = '2.7.5' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") classpath "io.spring.gradle:dependency-management-plugin:1.0.11.RELEASE" } } allprojects { } subprojects { apply plugin: 'java' apply ..

    [이커머스 프로젝트] API Gateway를 활용한 MSA (Micro Service Architecture)

    | MSA (Micro Service Architecture) Monolithic : 독립적으로 배포 가느안 서비스들을 모아서 하나의 application으로 만드는 설계 방식 장점 단점 - 각 어플리케이션의 독립적인 배포 가능 - 서비스의 일부를 독립적으로 수정, 개발 가능 - 특정 서비스의 scale up/out 이 가능 - 장애가 전체로 번지지 않는다. - 각 서비스의 독립적인 구성이 가능해진다. - 트랜잭션 관리가 어려움 - 배포 서비스가 늘어나고, 관련 관리 비용이 증가 - 운영의 복잡성이 증가 (너무 과하게 서비스를 쪼개는 건 피하자) DDD (Domain Driven Design) : 도메인 중심 개발 : ex. 배달 서비스의 Customer엔 DeliveryOrder API가 존재할 것. ..

    [이커머스 프로젝트] 환경 변수를 외부에서 주입하는 법

    [이커머스 프로젝트] 환경 변수를 외부에서 주입하는 법

    | 환경 변수를 외부에서 주입하는 방법 - @Value 어노테이션과 SpEL을 사용해서 application의 환경 변수 값을 가져올 수 있다. @Value("${email.key}") public String key; - 그러면 환경 변수의 값은 어디에 입력해두어야 하나? [1] application.yml 에 저장한다. --> github에 올리면 공개됨 [2] Run/Debug configuration의 VM options를 통해 "-D환경변수=값" 형식의 옵션을 건다. --> 여러 개는 관리 힘듬 [3] Run/Debug configuration의 Environment variables를 통해 name과 value를 각각 입력해준다.

    [Redis] Redis Insights 사용하기

    [Redis] Redis Insights 사용하기

    | Redis insight란? - Redis GUI이다. 사용자 편의를 위한 인터페이스임. - 다운로드 링크 : https://redis.com/redis-enterprise/redis-insight/ RedisInsight | The Best Redis GUI RedisInsight provides an intuitive and efficient graphical interface for Redis, allowing you to interact with your databases and manage your data. redis.com | 사용 사례 - Docker를 통해서 Redis를 pull, run 한 후, - Redis insight를 통해서 database를 입력하여 들어왔다. - 지금 어느..

    [이커머스 프로젝트] Docker란 무엇인가? (자료 정리)

    [이커머스 프로젝트] Docker란 무엇인가? (자료 정리)

    | Docker 정리 - 초보를 위한 도커 안내서 와 Docker 공식 사이트를 주로 참고하여 정리하였습니다. 1. Docker란 무엇인가? (1) Docker가 등장한 배경 하나의 Application에 다수의 프로그램들이 늘어났고, 이에 따라 서버를 효과적으로 관리하기 위한 무언가가 필요해졌다. 1) 동일 서버에 각기 다른 프로그램을 관리하기 어려움 > 하나의 서버에는 여러 개의 프로그램이 존재할 수 있다. > 이 프로그램들이 각자 사용하는 라이브러리의 버전이 모두 다르고 같은 포트를 사용할 경우 사용이 어려웠고, 결국 서버를 분리하게 되는 일이 발생했다. (==> 자원의 낭비) 2) 서버 환경이 변화할 때마다 유연하게 대처하기 어려움 3) DevOps 및 마이크로서비스 아키텍처의 등장과 함께 프로그..

    [스프링 시큐러티] JWT 토큰 + 스프링 시큐러티

    [스프링 시큐러티] JWT 토큰 + 스프링 시큐러티

    | 인증 방식의 종류와 한계점 1. 인증 방식의 종류 데이터 저장 위치 방식 Cookie key-value 형태의 문자열 브라우저 (or 로컬 메모리) (1) 사용자가 로그인 요청을 보낸다. (2) 서버는 Cookie 정보를 header의 Set-Cookie에 담아 응답한다. (3) 사용자가 요청할 때마다 Cookie를 header에 담아 보낸다. (4) 서버는 쿠키에 담긴 정보로 클라이언트가 누군지 식별한다. Session session id와 value가 든 세션 객체 * value는 map 형태로, 세션 생성 기간, 마지막 접근 기간, User 속성 등을 담는다. 서버 (메모리, 로컬 파일, DB) (1) 사용자가 로그인 요청을 보내면 세션이 서버에 저장된다. 이때, 세션의 식별을 위한 Sessio..

    [Redis] Redis를 Cache로 사용하기

    | Cache란? 용어 What? why? How? Cache 임시로 데이터를 저장하는 공간 성능 향상 - Look aside Cache, Write Back - Memcahced, Redis API 1. Cache의 배경과 목적 - 파레토의 법칙에 따르면, 80%의 결과는 20%의 원인에 의해 발생한다. - 다시말해, 사람들이 자주 쓰는 데이터는 정해져 있고 이를 캐싱해서 저장하면 DB에 접근할 필요가 없어진다. - 서비스를 런칭하고 사용자가 늘어나면 그만큼 DB 작업량도 늘어나기 마련이라 한다. - 이럴 때 캐시를 사용한다면, 성능을 개선할 수 있다. 2. Cache의 사용 방식 - 캐시는 조회 또는 쓰기를 할 때에 사용될 수 있다. Look Aside Cache (Lazy Loading) 캐시를 한..

    [JPA] Lazy Loading 개념

    | 관련 용어 용어 What? How? Lazy Loading 사용자가 보지 않는 리소스는 차후에 로딩하는 기술 - 프론트 : 무한 스크롤, placeholder 등 - 백엔드 : JPA의 지연 로딩 | JPA의 Lazy Loading - 개발자는 JPA를 통해 프록시를 만들 수 있다. - 프록시란, 가짜 객체를 말하는 것으로, 실제 엔터티에 대한 참조값을 가진다. - 하나의 엔터티가 다른 엔터티와 연관관계를 맺고 있을 때 (oneToMany) , 연관된 객체들을 처음부터 DB에서 조회하지 않고, 실제 사용하는 시점에 DB에서 조회하면 속도를 향상시킬 수 있다. - JPA에서는 프록시가 참조하는 객체들의 데이터 조회 시점을 정하는 타입을 Fetch Type이라 하는데, 즉시로딩 - 한 객체를 조회할 때,..

    [Scheduler] 스케줄러 사용하기 (feat. 쓰레드, 쓰레드풀)

    | Scheduler - 스프링에서 일정 주기마다 특정 작업을 수행할 수 있도록 하는 기능 - 주기 설정 fixedDelay 작업 완료시점을 기준으로 일정시간 지연 후 반복 fixedRate 작업 시작지점을 기준으로 일정시간 지연 후 방복 cron 정규식 표현 - Cron 표현식 (1) 사용법 // 초/분/시/일/월/요일/연도(생략가능) 0 0 0 * * * 테스트2 2022-11-11 13:28:05.641 DEBUG 23980 --- [ main] ySourcesPropertyResolver$DefaultResolver : Found key 'spring.liveBeansView.mbeanDomain' in PropertySource 'systemProperties' with value of type..