user-img
Develop > BACK-END 26
thumbnail
[DB] 인덱스 컨디션 푸시다운(Index Condition PushDown)
1
0. 학습 목적인덱스 컨디션 푸시다운의 정의를 이해한다.인덱스 컨디션 푸시다운이 활성화되었을 때와 비활성화 되었을 떄, 실행 계획이 어떻게 바뀌는지 이해한다.1. 인덱스 컨디션 푸시 다운이란?Index Condition Pushdwon(이하 ICP) 는 보조 인덱스를 활용하여 데이터를 가져오는 쿼리문에서 사용하는 최적화 전략이다.다음과 같이 진행되는 최적화를 ICP라고 한다.옵티마이저가 '범위를 줄일 수 없는 조건 컬럼이더라도' 보조 인덱스의 구성 요소로 존재하는 컬럼이면, 스토리지 엔진에게 전부 전달해준다.스토리지 엔진은 보조 인덱스를 탐색할 때, 옵티마이저에게 받은 조건 컬럼들로 최대한 유효하지 않은 튜플들을 걸러낸다. 이를 통해 스토리지 엔진이 본 테이블을 읽는 횟수를 줄인다. [!info] MyS..
6일 전
Develop > BACK-END
thumbnail
[Java] Java에서 정규 표현식 활용하기
0. 학습 목적정규 표현식을 활용할 수 있는 Java 클래스들에는 무엇이 있는지 파악한다. 해당 클래스들의 매서드의 뜻과 사용법을 익힌다.1. 정규 표현식을 활용할 수 있는 Java 클래스java.util.regex에 있는 Pattern 클래스와 Matcher 클래스 활용String 클래스의 정규 표현식 사용 가능 매서드 활용2. Pattern과 Matcher 이해하기(1) Pattern 클래스정규 표현식을 컴파일하여 가지고 있는 클래스불변 객체 (한 번 정규 표현식 입력해서 컴파일하면, 이후 동일 Pattern 객체의 정규 표현식은 바꿀 수 없다.)Thread-Safe -> 여러 스레드에서 같은 Pattern 객체 공유 가능Pattern 클래스는 정규 표현식을 담고 있는 역할 밖에 하지 않는다. 문자열..
1주 전
Develop > BACK-END
thumbnail
String Constant Pool: String 객체가 저장되는 곳
0. 학습 목적String Constant Pool 이라는 개념에 대해서 이해한다.String을 왜 불변 객체로 만들었는지 유추한다.1. String Constant Pool 이란?JVM Heap에 존재하는 메모리 공간으로 불변 객체인 String 리터럴 전용 저장 공간 이다.프로그램 내부에서 선언된 모든 String 리터럴은 String Constant Pool에 저장된다.2. 특징String Literal 만 저장Pool에 존재하는 문자열이 재 선언되면, 새로 할당하지 않고 있는 거 재활용 (1) String Literal 만 저장한다.String 객체 선언 방식은 2개로 나뉜다.// 리터럴 방식 선언String str1 = "Hello World";// 객체 방식 선언String str2 = new..
1주 전
Develop > BACK-END
thumbnail
Java의 String
0. 학습 목적String은 불변 객체임을 이해한다.유용한 String 클래스 함수를 알아둬서 알고리즘 문제를 풀 때 적용한다.1. String의 특징 : 불변성String 객체의 가장 큰 특징은 불변성이 보장 되는 객체 라는 것이다.(1) final 클래스로 선언됨final 클래스로 선언되어 있어서 상속이 불가능하다.(2) 값을 담는 멤버 변수도 private final 임String 문자열의 실질적 값을 담는 byte 배열도 private final로 선언되어 있다. 이 때문에, String 객체가 한 번 선언되면, 이후 새로운 값을 재할당 할 수 없다.(3) 그렇다면 문자열 변경 코드나 함수는 어떻게 작동할까?원래의 String 객체에 값이 추가되는 것이 아니라, 새로운 String 객체가 만들어진..
1주 전
Develop > BACK-END
thumbnail
[백엔드] Spring에서의 IoC 구현
0. 학습 목적Spring에서 제어의 역전을 어떻게 구현했는지 이해한다.Spring에서 객체의 생성과 관리를 담당하는 컨테이너를 어떻게 생성하는지 이해한다.Spring에서 객체를 어떻게 해당 컨테이너에 등록하는지 이해한다.Spring에서 어떻게 객체를 주입하는지 이해한다.1. Spring에서는 IoC를 어떻게 구현했는가?Spring에서는 Spring IoC Container라는 객체 생성과 관리 전용 컨테이너를 만들어서 IoC를 구현하였다. Spring에서 IoC가 이루어지는 과정을 그려보면 다음과 같다.출처: javaguide.net과정을 말로 풀어보면,프로그램 시작 시, Spring IoC Cotainer가 ApplicationContext 구현체로 생성된다.컨테이너가 생성하고 관리할 객체를 찾는다...
2주 전
Develop > BACK-END
thumbnail
[백엔드] IoC (Inversion of Control)란?
0. 학습 목적IoC (inversion of Control)이 무엇인지 이해한다.1. IoC 란?객체 생성과 관리에 대한 통제권을 개발자에서 프레임워크로 넘기는 것을 말한다.(1) IoC 이전의 전통적 OOP 방식 모듈 간 결합public class OrderController { public void processOrder() { // 직접 객체 생성 - 강한 결합 PaymentService paymentService = new PaymentService(); EmailService emailService = new EmailService(); // 사용 paymentService.processPayment(); emai..
2주 전
Develop > BACK-END
thumbnail
SELF INVOCATION의 정의, 원리, 해결 방법
0. 학습 목적SELF INVOCATION이 무엇인지, 언제 일어나는지 이해한다.해결 방법이 무엇인지 이해한다.1. SELF INVOCATION 이란?AOP 매커니즘 사용 시 겪을 수 있는 부작용 중 하나이다.특정 객체의 멤버 매소드 A가 같은 객체 내부의 매소드 B를 직접 호출할 때, B에 걸려있는 AOP는 무시되는 현상이다.(1) 예시다음과 같은 클래스 TEST 가 존재한다고 해보자.public class Test { public void methodAB(A a, B b) { methodA(A a); methodB(B b); } @Transactional public void methodA(A a) { repository.save(A a); ..
4주 전
Develop > BACK-END
thumbnail
@Transactional에 관하여
0. 학습 목적@Transactional이 무엇인지 이해한다@Transactional의 구성요소와 작동원리를 이해한다.왜 새로운 스레드에는 트랜잭션이 전파되지 않는지 이해한다.1. @Transactional 이란?Spring Framework에서 트랜잭션을 선언적으로 관리할 수 있게 만든 어노테이션(1) '선언적으로 관리한다. ' 의 의미트랜잭션 관리가 필요한 클래스나 매서드에 @Transactional 어노테이션을 '선언'만 하면, 선언된 범위를 하나의 트랜잭션 컨텍스트로 묶어서 관리해준다.장점은 다음과 같다.트랜잭션 간의 경계 파악이 쉽다.비즈니스 로직과 트랜잭션 관리 로직이 분리되어 비즈니스 로직 집중과 유지보수가 수월해진다.(2) 트랜잭션 선언 범위에 따른 의미클래스에 설정 시, 해당 클래스의 모..
4주 전
Develop > BACK-END
thumbnail
[개발 지식] AOP (관점 지향 프로그래밍)의 개념
0. 학습 목적AOP가 무엇인지 이해한다.AOP가 나오게 된 이유에 대해 이해한다.AOP의 구조와 용어들을 이해한다.AOP의 작동원리를 이해한다.SPRING에서 AOP를 어떻게 구현할 수 있는지 그 방법들에 대해 이해한다.1. AOP 란?AOP란 Aspect Oriented Programming (관점 지향 프로그래밍) 의 약자로, 관심사 라는 관점에 따라 서비스를 분리하여 프로그래밍 하는 방법을 말한다.여기서 관심사는 두 개로 나뉜다.핵심 관심사 (Core Concern): 사용자가 요구하는 비즈니스 로직 그자체횡단 관심사 (Cross-cutting Concern): 사용자의 요구 외의 부가적인 로직 (트랜잭션 관리, 로깅, 보안, 메트릭 수집)하나의 서비스 객체 내에서 핵심 관심사 와 횡단 관심사 를..
5주 전
Develop > BACK-END
thumbnail
[백엔드] Tistory-card-stats, 깃허브 프로필 용 티스토리 카드 만들기 (1)
0. tistory-card-stat 을 만들려고 한 이유티스토리를 기술 블로그로 활용하고 있는데, 내가 티스토리에 쓴 최신 글 내용을 깃허브 프로필에 가져오고 싶었다. 옆동네 Velog의 경우, 이러한 갈증을 해소해줄 너무나 세련된 카드가 이미 존재한다.만드신 분 깃허브 - enugyeole-velog-readme-stat이렇게 자기 velgo 계정을 넣으면 내용이 보이도록 해주고 있다. 티스토리도 관련된 오픈 소스가 있는지 확인하기 위해 깃허브를 다 뒤졌지만 존재하지 않았다. 아 존재했지만, 더 이상 서비스를 하지 않고 있는 중이었다. 그릿 속의 해빗이라는 개발자 분 께서 Gihub Profile 전용 card-stat을 만들었으나, 더 이상 서비스 하고 있지 않았다.왜 그런지 봤더니, 이유가 다음..
2025.04.17
Develop > BACK-END
thumbnail
[성능 테스트] Jmeter로 시나리오 테스트 작성하기
0. 들어가며...현재 구인 구직 서비스의 서버를 만들며, 다음과 같이 구현한 상태이다. 일 (job)과 회원 (member)는 매칭(matching)이란 교차 테이블을 두고, 서로 관계를 맺고 있기에, 연관이 있는 회원은 일과 하나의 상태를 가진다.위의 의뢰인은 일의 주인이다. 따라서 상태는 OWNER만 가진다. 반면 해결사는 자신의 현재 단계에 따라 다른 상태를 가진다. 신청만 했거나 의뢰인에게 선 의뢰를 받은 상태라면, ATTENDER나 REQUEST를 가지고, 의뢰인에게 해결 요청을 승낙 혹은 거절 받거나 혹은 해결사가 선의뢰를 승낙 혹은 거절한 상태이면, YES 혹은 NO라는 상태를 가진다.START는 일을 진짜 시작해야만 가지는 상태이며, SLEEP은 해결사가 일 해결에서 노쇼한 경우 의뢰인이..
2025.03.25
Develop > BACK-END
thumbnail
[성능 테스트] 대량의 유저 동접을 위한 JWT 토큰 추출 및 수집기 구현
0. 들어가며...현재 진행하고 있는 구름 PROTECT에서 구현한 API에 대한 성능테스트를 하고 있다. 필자는 진정한 대량의 성능 테스트를 위해서는 매번 다른 JWT 토큰 값이 Header에 담겨야 한다고 생각했다. 이유는 다음과 같다.실제와 같은 환경을 최대한 구현할 수 있다. 실제 서비스에서도, 다른 사용자는 한 명도 사용하지 않는데, 한 사람만 요청을 5만 번 하는 경우는 극히 드물 것이다. 한 사람이 매번 같은 요청을 할 경우, DB 캐싱과 서버 캐싱으로 해당 내용이 메모리에 저장될 것이므로, 진정한 서버의 성능을 볼 수 없을 것이라 판단했다.따라서 여러 명이 서비스를 각자 사용하고 있는 것을 흉내내고자 HEADER의 Authorization에 매 번 다른 토큰 값을 넣었다.1. 토큰 생성 ..
2025.03.24
Develop > BACK-END
thumbnail
Log 색깔 입히기
0. 로그가 흰색이면...보기가 힘들다.이게 인텔리제이에서 보면 그나마 나은데, 배포된 서버로 들어가 로그를 볼려고 치면 정말 구분히 힘들어진다. 이를 위해로그 레벨 별로 색깔을 적용하여 가독성을 높이려 한다.1. 적용 방법(1) 파일 구조 및 의존성 삽입resources 부분에 logBack을 둔다. 이후 로깅과 실제 구현 코드 간의 관심사 분리를 위해 @SLF4J 라이브러리를 삽입한다. 이 라이브러리를 쓰지 않으면 로그를 쓰고 싶은 모든 클래스마다 Logger 객체를 주입 받아야 한다. 이는 객체간의 결합도를 높이고, Logger 기능 자체의 유연성도 줄인다. (처음엔 Log-Back 라이브러리를 쓰다가 Log4j로 바꾸고 싶을 때 @SL4FJ를 안 쓴다면 모든 Logger 멤버를 바꿔줘야 한다;;)..
2025.02.13
Develop > BACK-END
thumbnail
Jasypt를 활용해 Secret-key 암호화 및 서버 배포 시 자동 복호화
0. 왜 필요한가외부 API나 DB, 미들웨어 연동을 위해서는 활용을 위해 약속한 secret-key를 들고 있어야 한다. 보통 개발자들은 설정파일에 그것을 몰아넣고, @Value()를 활용하여 그것들을 불러온다. 다음 사진과 같이 말이다.이런 secret-key들은 유출되면 해킹 등 프로젝트에 치명적인 위협을 준다. 그래서 개발자들은 항상 이것들에 대해 신경 쓰고, 인프라 팀 또한 Jenkins나 DockerHub에 키 리스트들을 따로 관리해야 해서 골치 아프다. 이를 해결하기 위해 Java의 라이브러리인 Jasypt를 활용했다.1. Jasypt란?(0) 정의단방향 암호화 혹은 단일 키 양방향 암호화를 가능하게 해주는 라이브러리이다. 이 라이브러리의 강점이라 한다면 Jasypt로 암호화한 대상을 특정하..
2025.02.12
Develop > BACK-END
thumbnail
공통 응답 자동화 설계 및 구현 (봉투 패턴 도입 - @ResponseBody Advice)
0. 필요성저번에 했던 6인 프로젝트의 반환 환경 모습이다. 당시 ResultResponse라는 팀 내의 공통 응답 규칙을 정하고, ResponseEntity로 반환하기 전에 DTO를 ResultResponse로 한 번 더 감싸서 반환했다.그 당시에는 큰 불편함 없이 했던 것 같지만, 다시 보니 2가지 불편 사항이 있었다.1️⃣ 매서드의 반환 타입을 항상 ResponseEntity와 ResultResponse로 감싸줘야 한다. 실제 필자가 프론트 개발자에게 줘야할 JSON 반환 객체는 TokenDTO인데, 그저 반환 규칙을 위해서 프로세스에서는 불필요한 객체를 추가해야만 한다.2️⃣ 같은 이유로 반환값 또한 두 객체를 활용해 감싸줘야 한다.이는 3인의 백엔드 개발자 중 한 명이라도 실수로 ResultRe..
2025.02.12
Develop > BACK-END
thumbnail
[토큰 인증 방식]의 원리, 세션 인증과의 차이점
1. Token 인증 방식이 어떻게 이루어 지는가회원이 로그인을 시도한다고 가정해보자.ⓐ Client가 ID/PW 로그인 창에 써서 제출한다.ⓑ Server가 DB를 통해 해당 ID/PW를 가진 회원이 있는지 확인한다.여기서 해당 회원의 정보가 우리 DB에 있어서 우리 회원인 것이 확인 되었다고 가정해보자.ⓒ Server에서 해당 회원의 정보를 이용하여 고유한 Token을 만든다.ⓓ 그리고 해당 토큰을 아까 유효한 요청을 한 클라이언트에게 보내준다.ⓔ 이제 클라이언트는 인증이 필요한 API를 이용할 경우 해당 Token을 요청 Header에 동봉하여 같이 보낸다.ⓕ 이제 서버에서는 해당 Token의 유효성을 검증 후 유효한 토큰이 맞다면 응답으로 요청한 내용에 대한 정상 답변을 보내주면 된다.그렇다면 기..
2024.07.07
Develop > BACK-END
thumbnail
[Intellij] Git Shelve와 Stash의 차이
1. Git Shelve - 잠시 다른데 다녀올거니까. 작업하던 거 선반에 올려두자!git shelve를 하면 해당 Branch의 임시 저장소에 저장된다.현 branch의 변경사항을 들고, 다른 branch에 놔두는 행위를 못한다.해당 브랜치에 작업 하던 것을 임시 저장하고, 다른 branch에서 일 본 뒤에 다시 돌아와서 unshelved 하면 된다.임시저장한 거 빼내 오려면저걸 눌러서 다시 changes로 들고와야 한다.unshelved 했다고 해서 shelf에 저장된 임시 저장 내역이 사라지지 않는다. 없애고 싶다면 삭제하자.2. git stash / unstash - 현 branch에서 작업한 내역 들고 다른 branch로 갈래. 거기서 작업 계속 이어 갈래Intellij 에서는 git -> un..
2024.05.06
Develop > BACK-END
thumbnail
특화 프로젝트 Spring Security 분석
1. 개요4월 5일부로 특화 프로젝트가 끝났다. 이번 프로젝트에서 보안을 맡았는데, 항상 내가 맡은 파트를 정리해야겠다는 생각을 했다. 벌써 2주 반이 흘렀기에, 더 까먹기 전에 미리 정리해두려한다.해당 프로젝트의 전문을 보고 싶다면, 다음을 확인하자.SSAFY 10기 구미 2반 특화프로젝트 WALK_WALK2. 전개도3. 코드 분석(1) JwtAuthFilter 안에 있는 JwtUtil 분석import io.jsonwebtoken.*;import io.jsonwebtoken.security.Keys;import jakarta.annotation.PostConstruct;import jakarta.servlet.http.HttpServletRequest;import lombok.RequiredArgsCo..
2024.04.26
Develop > BACK-END
thumbnail
JWT에 대하여
1. JWT란 무엇인가?기본적인 토큰 인증 방식을 따르고, 거기서 토큰 자체를 강화한 방식이라 생각하면 된다.원래의 토큰 인증 기반에서 요청자가 보내온 ID/PW 가 DB에 존재하면 (우리 회원이 맞으면) 그 요청자에게 자신들의 API를 쓸 수 있는 허가증인 토큰을 전해줬었다. 여기서 더해 JWT의 경우 토큰을 만들 때, 사용자의 정보(간단한 개인정보 등 +@)를 암호화하여 만든다.이렇게 되면 무엇이 좋을까?아까 토큰 자체가 사용자에 대한 개인 정보라고 하였다. 회원가입을 하여 토큰을 받았다면, 이후 API 요청을 할 때, 토큰을 Header나 Cookie에 넣어서 보낸다. 만약 클라이언트가 원하는 요청이 사용자의 개인정보에 대한 요청이라면, 서버에서는 DB를 조회할 필요없이 토큰을 복호화 하여 그 안의..
2024.04.25
Develop > BACK-END
thumbnail
Weaving과 Proxy에 대하여
깃허브에도 정리 올려놓았습니다.전수민_깃허브 주소Weaving과 Proxy 객체에 대하여이번 장에서 알아볼 것:AOP에서 Weaving이란 무엇인가? Proxy와의 관계는 어떻게 되는가?Proxy 객체란 무엇이고? AOP에서 사용되는 원리는 무엇인가?1. AOP에서 Weaving이란 무엇인가?AOP에서 weaving이란 부가기능(advice)을 그것이 타겟팅하는 본 기능에 장착하는 작업을 말한다. 따라서 weaving은 본기능에 영향을 주지 않으면서 부가기능을 연결시키는 AOP의 핵심 작업이다.weaving은 실행되는 시점에 따라 3가지로 종류가 나뉜다.(1) Compile Time Weaving(CTW)Spring에서 AOP를 구현하는 방법에는 AspectJ라는 라이브러리를 쓰는 것과, Spring A..
2024.03.12
Develop > BACK-END
thumbnail
[01]-OAuth2 이론
목차1. OAuth2의 등장 배경 (OAuth2란 왜 필요한가?)2. 그래서 OAuth2란?3. OAuth2 관련 용어 정리 4. OAuth2의 동작 과정 1. OAuth의 등장 배경  (OAuth2란 왜 필요한가?)현 IT 서비스 시장에는 구글이나 아마존, 트위터와 같은 메가급 기업들이 다수 존재한다. 이 기업의 사용자들은 수천만 많게는 억대 단위로 넘어간다. 그 만큼 해당 기업들이 가진 리소스도 다수 존재할 것이다. 하지만, 단체생활을 해봤다면 알 수있듯이 하나의 일을 작업자 전원이 만족하는 방식으로 수행한다는 것은 불가능에 가깝다. A는 서류 작업을 더 완벽히 하고 다음 일로 갔으면 좋겠고, B는 그저 본 작업을 빨리 진행하고 싶을 수도 있다. 이는 우리가 특정 서비스를 이용할 때도 마찬가지이다. ..
2024.03.03
Develop > BACK-END