분류 전체보기(235)
-
CSS 네임스페이스와 BEM 방법론
CSS 네임스페이스(Namespace)와 BEM(Block, Element, Modifier) 방법론은 복잡한 웹 프로젝트에서 CSS의 유지보수성(maintainability)과 확장성(scalability)을 높이고 스타일 충돌을 방지하기 위해 사용되는 중요한 전략들이다.CSS 네임스페이스 (CSS Namespacing) ✨CSS 네임스페이스는 CSS 규칙 간의 이름 충돌(naming collision)을 피하기 위한 전략이다. 특히 여러 개발자가 협업하거나, 외부 라이브러리/위젯 코드를 프로젝트에 통합할 때 발생할 수 있는 전역적인 스타일 오염 문제를 방지하는 데 중점을 둔다.🎯 목적스타일 충돌 방지 : 전역 스코프(global scope)에서 발생하는 CSS 클래스 이름, ID 이름 충돌을 최소화..
2025.06.06 -
보안 정책 : SOP와 CORS
우리가 웹 서핑을 하다 보면 무조건 신뢰할 수 있는 사이트만 들어가는 것은 아니다. 잘 알려진 사이트 말고 한 번도 들어본 적 없는 사이트에 들어갈 수도 있고, 보이스피싱 용도로 URL만 비슷하게 만든 사이트에 접근하게 될 수도 있다.그런데 만약에 내가 구글에 로그인한 상태에서 피싱 사이트에 들어갔는데 해당 사이트에서 내 구글 로그인 정보에 마음대로 접근할 수 있다면 나의 개인정보가 유출되어 막대한 피해를 일으킬 수도 있다. 때문에 브라우저에서는 기본적으로 SOP라는 보안 정책을 사용한다. 그렇다면 SOP란 무엇인가?동일 출처 정책(Same-Origin Policy)동일 출처 정책이란 특정 출처(출처 A : 구글)에서 로드된 문서나 스크립트가 다른 출처(출처 B : 티스토리)의 리소스와 상호작용하는 것을..
2025.06.05 -
[3편] 좋은 DI 설계: 스프링의 빈 탐색 원리와 OCP
의존성 주입 동작 원리 : 스프링은 어떻게 빈(Bean)을 찾는가?객체와 타입 : Java에서는 클래스(Class)가 곧 타입(Type)이다. public class ItemRepository는 ItemRepository라는 새로운 타입을 정의하는 것이다.주입 대상 : DI는 클래스 내부의 특정 요소가 아닌, 클래스 설계도로 만들어진 객체(Object) 전체를 주입한다. 주입된 객체의 public 메서드를 통해 내부 기능에 접근한다.주입 원칙: 스프링은 기본적으로 타입(Type)을 보고 주입할 Bean을 찾는다.만약 해당 타입의 Bean이 여러 개라면(DiscountPolicy 예시), @Primary 어노테이션이 붙은 Bean을 우선적으로 선택하거나, @Qualifier를 통해 특정 이름의 Bean을 ..
2025.06.03 -
[2편] 스프링 DI의 3가지 방식 : 생성자 주입을 써야만 하는 이유
의존성 주입의 3가지 방식과 권장 사항그렇다면 실제로 스프링에는 의존성 주입을 어떻게 할까? 크게 3가지 주입 방식이 있다.주입 방식특징권장 여부생성자 주입객체 생성 시점에 모든 의존성을 주입. final 키워드 사용 가능, 불변성 보장.*️⃣ 강력 권장 (표준)수정자(Setter) 주입Setter 메서드를 통해 주입. 선택적인 의존성이나 변경 가능성이 있을 때 사용.△ 제한적 사용필드 주입필드에 @Autowired를 직접 선언. 코드가 간결하지만 테스트가 어렵고 여러 단점이 있음.❌ 비권장의존성 주입을 위한 전제조건 : @Autowired와 스프링 빈위에서 의존성 주입의 3가지 방식을 살펴봤는데, 실제로 이것이 동작하려면 두 가지 핵심 전제조건이 필요하다.스프링 빈(Bean) 등록: "부품 상자에 부품..
2025.06.03 -
[1편] 의존성 주입(DI)과 제어의 역전(IoC), 왜 필요할까?
의존성 주입이란 무엇인가?의존성 주입(Dependency Injection, DI)이란 객체가 사용할 다른 객체(의존성)를 직접 만들지 않고, 외부(스프링 IoC 컨테이너)에서 주입받는 디자인 패턴이다. 디자인 패턴이라고 말했지만 사용자가 직접 구현해야하는 것이 아니라 스프링이라는 프레임워크가 기본적으로 채택하여 자동으로 적용되는 사항 중 하나다. 마치 자바라는 언어가 객체 지향의 패러다임을 사용하고 자바스크립트는 함수형 패러다임을 사용하듯 스프링이라는 프레임워크 자체에 적용되는 일종의 문법적 요소라고 볼 수 있다.목적 : 객체 간의 결합도(Coupling)를 낮추고, 각 객체가 자기 책임에만 집중하도록 응집도(Cohesion)를 높이기 위해 사용한다. 이를 통해 유연하고, 확장 가능하며, 테스트하기 쉬..
2025.06.02 -
데이터베이스 분리 및 확장 전략 총정리
데이터베이스를 분리하고 분산하는 궁극적인 목표는 성능, 확장성, 가용성, 그리고 관리 용이성을 확보하여 대규모 서비스를 안정적으로 운영하는 것이다.수직 확장 (Vertical Scaling / Scale Up)개념: 기존에 사용하던 단일 DB 서버의 CPU, RAM, 저장 공간(SSD) 등 하드웨어 자원을 단순히 늘리는 것. 더 좋은 성능의 서버로 교체하는 것과 같다.분리 여부: 데이터베이스 자체를 '분리'하는 것은 아니다.주된 목적: 가장 쉽고 빠르게 단일 서버의 성능을 향상시킨다.장점: 구현이 간단한다.단점: 물리적인 한계가 명확하며, 비용이 기하급수적으로 증가하고, 단일 장애 지점(SPOF)이 될 수 있다.복제 (Replication / Read Replicas)개념: 마스터(Master) DB 서..
2025.06.02 -
스프링의 싱글톤 패턴과 무상태 설계의 필요성
스프링 프레임워크는 기본적으로 싱글톤 패턴을 사용한다. 즉, 어떤 클래스의 인스턴스를 단 하나만 생성하도록 보장하는 디자인 패턴을 사용한다는 것이다.그렇다면 왜 인스턴스를 하나만 만들까?요청마다 인스턴스를 만들면 안 되는 이유 (싱글톤의 필요성)만약 웹 애플리케이션에서 사용자의 웹 요청이 올 때마다, 해당 요청을 처리하는 객체(예: 회원 가입을 처리하는 UserService, 주문을 처리하는 OrderService 등)를 매번 새로 생성한다고 가정해 보자. 이는 다음과 같은 심각한 문제를 야기한다.식당에서 손님 올 때마다 '새 주방'을 만드는 것손님이 식당에서 들어와서 주문을 할 때마다 그 손님 전용의 주방을 새로 만들고 요리가 끝나면 주방을 없앤다면 어떻게 될까? 이는 정말로 비효율적인 방법일 것이다...
2025.06.01 -
동시성 제어 : 데이터 일관성을 위한 낙관적 잠금과 비관적 잠금
우리가 프로그램을 사용하다 보면 여러 사람의 요청이 충돌하는 경우가 있다. 예를 들면 한정 판매(콘서트, 극장 예매)나 수강 신청 같은 경우 말이다. 이런 요청들을 데이터베이스 및 시스템 관점에서 트랜잭션(Transaction)이라고 부른다.트랜잭션이란?트랜잭션은 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 논리적인 단위다. 프로그램의 데이터는 일반적으로 데이터베이스(DB)에서 관리되는데 이 DB의 데이터에 여러 트랜잭션이 동시에 접근하고 변경할 때, 별도의 조치를 하지 않는다면 여러 오류가 발생할 수 있다. 물건 A의 수량이 1개 남았는데 그것을 2명이 모두 주문에 성공했다면 어떻게 될까? 판매자 입장에선 상당히 난처하겠지만 어느 정도 고객 응대로 해결 할 수 있는 문제다. 하지만 자릿수가 정..
2025.05.31 -
✨ 스프링 빈(Bean) 조회: 컨테이너 객체 활용 가이드
스프링에서 스프링 빈(Bean) 조회는 스프링 컨테이너(Spring Container)에 등록된 객체들을 찾아보는 방법이다. 빈 확인은 주로 테스트(Test) 상황에서 많이 활용한다. 빈 등록 방법은 크게 자동 빈 등록(Automatic Bean Registration)과 수동 빈 등록(Manual Bean Registration)으로 나뉘며, 등록 방법에 따라서 조회 방법 또한 달라진다.🎯 주요 사용 목적스프링 빈 조회는 다음과 같은 목적으로 사용된다.등록된 빈 확인 : 원하는 빈이 제대로 등록(Registration)되었는지 확인하고, 어떤 빈들이 등록되어 있는지 전체적으로 파악(Overall Grasp)한다.문제 해결 : 의존성 주입(Dependency Injection)이 제대로 되었는지 확인하..
2025.05.29 -
스프링 내장 Order 어노테이션 자동 임포트 문제
문제 상황// 의도: 주문 생성 메서드 작성public Order createOrder(long memberId, String itemName, int itemPrice) { // ...}// 결과: IDE가 자동으로 추가한 잘못된 importimport org.springframework.core.annotation.Order;원인Spring Framework에 이미 Order라는 어노테이션이 내장되어 있음IDE가 스프링 관련 클래스를 우선적으로 임포트하는 경향이 있음같은 이름의 클래스가 존재할 때 IDE의 자동 임포트 우선순위 문제문제 식별 방법// 잘못된 참조 시 메서드 시그니처가 이렇게 변환됨public org.springframework.core.annotation.Order createO..
2025.05.27