전체 글 39

다이나모 DB에 대하여

1. Primary Key후보키 중에서 설계자에 의해 선택된 키중복 불가능하여 한 행(row)를 고유하게 식별할 수 있다NULL 값을 갖는 것이 불가능하다테이블은 오직 하나의 기본키를 가질 수 있지만 기본키가 반드시 하나의 컬럼으로 이루어져야하는 것은 아니다.  2. Dynamo DB Dynmamo DB는 하나의 논리적인 데이터베이스가 물리적으로 여러 서버(노드)에 나뉘어 저장되는 분산 데이터베이스 시스템을 기반으로 한다. 🔍분산 데이터베이스 시스템이란?하나의 서버로는 감당할 수 없는 데이터량과 트래픽을 처리하기 위해 사용된다 DynamoDB 같은 분산 데이터베이스는 Partition Key(PK)를 기준으로 데이터를 자동으로 여러 파티션(서버)에 나눠 저장한다.## 파티셔닝 (Sharding)예) P..

Programming/TWIL 2025.04.13

[TWIL] DB JOIN 으로 인한 중복 증가 현상에 대하여

💡 상황게시글 테이블 Post키워드 테이블 Keyword관계 1:N (게시글 1개가 여러개의 키워드를 가짐)요구사항 키워드를 조인해서 출력하되, 게시글을 기준으로 최신순 10개씩만 가져오고 싶었음 (페이지네이션 처림)   🔍 기존에 작성했던 쿼리SELECT p.id, p.title, k.keywordFROM post pLEFT JOIN keyword k ON p.id = k.post_idORDER BY p.created_at DESCLIMIT 10; 단순히 LEFT JOIN을 하고, LIMIT 10을 하면게시글이 최신순으로 10개씩 뿅 하고 나타나겠지 히히!  결과는 1 페이지엔 게시글이 3개, 2 페이지엔 게시글이 8개, 3페이지엔 게시글이 4개....들쑥날쑥 갯수가 바뀌는 것 이었다... ⚠️ 결..

Programming/TWIL 2025.04.06

[TWIL] 1:N 문제와 예시

1. N + 1 문제란?N+1 문제는 하나의 쿼리(1)로 N개의 결과를 가져온 후, 각 결과마다 추가 쿼리(N)가 실행되는 상황을 말한다. 예를 들어서, Member가 100명이면members 조회 쿼리: 1번각 member가 가진 Post 조회 쿼리: 100번총 101번의 쿼리 발생 → 이것이 N+1 문제 2. MyBatis에서 발생하는 N+1 문제public class Member { private Long id; private String name; private int age; private List posts; // 나중에 수동으로 채움}public class Post { private Long id; private String name; private Lo..

Programming/TWIL 2025.03.23

[TWIL] 스프링 시큐리티 딥다이브

1️⃣스프링 시큐리티Spring Security is a framework that focuses on providing both authentication and authorization to Java applications. Spring은 스프링 시큐리티가 인증과 인가를 제공하는데 초점을 맞춘 프레임워크라고 소개합니다.  일반적으로 웹의 요청은 클라이언트 -> 서블릿 컨테이너(필터) -> 디스패처 서블릿 -> 인터셉터 -> 컨트롤러 순으로 진행됩니다.    이 때 스프링 시큐리티는 서블릿 컨테이너 내부에 있는 '필터'로부터 실행됩니다.사용자의 요청이 스프링 컨텍스트 내부에 있는 자원에 도달하기 전에 DelegatingFilterProxy가 스프링 시큐리티 필터 체인을 호출합니다. 내부에 있는 자원에 ..

Programming/TWIL 2025.03.16

[TWIL] 왜 내가 설정한 로깅은 오락가락할까? 스프링 AOP와 프록시에 대하여

📌 개요프로젝트를 진행하며 메소드 A가 실행되기만 해도로그가 찍힐 수 있도록 AOP를 이용해서 코드를 작성했다.  그러나 의도와는 다르게 로깅이 터키아이스크림마냥 오락가락하는 것이 아닌가...메소드 A가 외부에서 호출될 땐 로깅이 잘 찍히지만,같은 클래스의 메소드 B가 메소드 A를 호출하면 로깅이 찍히지 않는 것이다. 로깅이 잘 적용되지 않는 이유를 알아보기 위해서 다음 내용을 정리했다. 1️⃣ 스프링 AOP와 프록시 기반 동작 방식스프링 AOP는 프록시(Proxy) 객체를 활용하여 메서드 호출을 가로채는 방식으로 동작한다. 이를 이해하기 위해서 AOP의 개념부터 살펴보자. 1.1 스프링 AOP  AOP란 관점지향프로그래밍(Aspect Oriented Programming)이다. 간단히 말하면 공통적으..

Programming/TWIL 2025.03.08

[TWIL] 웹 어플리케이션 아키텍처의 기초 (EC2/WAS/DOCKER)

📌 개요하나의 웹 어플리케이션을 완성시키기 위해서 각각의 구성요소들이 어떤 역할을 하는지 정확히 알아야 한다고 생각한다.'EC2에 내 스프링부트 프로젝트를 올리기만 하면, 웹 서버 만든거 아님?' 이라고 생각했던 과거의 나 자신을 반성하며간단히 Amazon EC2, WAS, Docker에 대해 알아보고자 한다. 1️⃣  EC2EC2(Amazon Elastic Compute Cloud)는 단순히 AWS로부터 컴퓨터 한대를 빌려서 쓰는 개념이다.조립식 컴퓨터를 첫 구매했을때를 떠올려보라. 열심히 조립하고 부팅하면 정말 아무것도 없는 것을 볼 수있다. EC2도 마찬가지로 운영체제(Ubuntu, Amazon linux) 등을 설치 후에WAS와 DB를 올리고 나서야 애플리케이션을 실행할 수 있는 환경이 조성된다..

Programming/TWIL 2025.02.16

[Java/Spring] 리플렉션이 DI컨테이너에서 동작되는 과정

DI 컨테이너에서 리플렉션의 실제 동작(1) 클래스 정보를 로드DI 컨테이너는 애플리케이션 시작 시, 관리할 클래스(스프링에서는 @Component, @Service 같은 어노테이션이 붙은 클래스)를 탐색합니다.리플렉션을 사용해 클래스의 정보를 읽어들입니다.(2) 의존성 정보 추출리플렉션으로 클래스의 필드, 생성자, 메서드 등을 탐색하여 의존성을 추출합니다.예를 들어, 특정 필드에 @Inject 어노테이션이 붙어 있다면, DI 컨테이너는 해당 필드가 주입 대상임을 알게 됩니다.(3) 객체 생성클래스의 생성자를 리플렉션으로 호출하여 객체를 생성합니다.예를 들어, UserRepository가 필요하면 DI 컨테이너는 UserRepository의 Class 객체를 이용해 런타임에 인스턴스를 만듭니다.(4) 의..

[Java] 컴파일 시점과 런타임 시점의 차이

DI 컨테이너가 리플렉션을 사용하여 동작하는 원리에 대해 읽다가,문득 컴파일 시점과 런타임 시점이 나뉜 이유가 궁금해졌다. 근본적으로 컴파일/런타임을 이해하지 못해서 리플렉션도 잘 이해하지 못하고 있는 것 같아서두 개의 차이를 알아보고자 한다.1. Complie과 Runtime컴파일 시점 (Compile-Time)코드가 작성된 후, 컴파일러에 의해 바이트코드로 변환되는 시점이다.주요 작업:문법 오류 체크.타입 검증 (예: 변수 타입과 메서드 호출이 올바른지 확인).클래스 파일(.class) 생성.결과물: JVM이 실행할 수 있는 바이트코드(.class 파일)가 생성된다.런타임 시점 (Runtime)컴파일된 바이트코드를 JVM이 실행하는 시점이다.주요 작업:JVM이 클래스 로더(ClassLoader)를 통..

[Servlet/Spring] Filter, Interceptor, AOP의 차이

필터(Filter):서블릿 컨테이너 레벨에서 동작.스프링 프레임워크와 독립적으로 동작하며, DispatcherServlet 이전에 요청을 처리합니다.주로 인증, 로깅, CORS 설정 등에 사용.인터셉터(Interceptor):Spring MVC 레벨에서 동작.DispatcherServlet과 컨트롤러 사이에서 요청을 처리하거나 가로챕니다.주로 요청 전/후의 처리 로직에 사용.AOP:스프링 컨테이너 내부의 스프링 빈에만 적용됩니다.특정 메서드 호출 전/후 또는 예외 발생 시 로직을 삽입합니다.주로 트랜잭션 관리, 로깅, 권한 검사, 캐싱 등에 사용됩니다.

[Java] Java 버전에 따른 핵심 변경 사항 (Java8)

Java는 크게 Java8, Java11, Java17 에서 핵심 기능이 변경되었다.먼저 Java8의 핵심 변경 사항부터 알아보자.🤍 Lambda Expression (람다식)람다식은 익명함수를 정의하는 간결한 방법이다. 즉, 이름이 없는 함수를 표현하기 위한 문법이다.기본 문법 (매개변수) -> {실행코드}사용람다식은 함수형 인터페이스을 통해 사용됨함수형 인터페이스메소드가 하나만 존재하는 인터페이스@FuctionalInterface 애노테이션함수형 인터페이스임을 명시적으로 표현🤍Stream AP스트림(Stream)스트림은 데이터의 흐름이다.스트림은 한 번만 소비할 수 있다.스트림의 특징선언적 프로그래밍: '무엇을 할 것인가'에 집중하며, '어떻게 구현할 것인가'는 신경쓰지 않음.원본 데이터를 변경하..

반응형