분류 전체보기 610

[Spring][Core] 3-5. Container: Additional Capabilities of the ApplicationContext

1. MessageSource국제화를 지원하는 인터페이스다양한 언어로 메시지를 관리하고 사용자에게 언어별로 적절한 메시지를 제공할 수 있게 함public interface MessageSource { @Nullable String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale); String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException; String getMessage(MessageSourceResolvable resolvable, Loc..

Spring/Spring 2025.04.06

[Spring][Core] 3-4. Container: Environment Abstraction

1. Profile특정 환경에서만 등록될 빈(Bean) 정의의 논리적 그룹 @Profile 애너테이션특정 프로파일이 활성화될 때만 해당 빈이 등록되도록 합니다표현식 사용 가능 (&, |, !) 예제) @Profile더보기@Configuration@Profile("development")public class StandaloneDataConfig { @Bean public DataSource dataSource() { return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.HSQL) .addScript("classpath:com/bank/config/sql/schema.sql") ..

Spring/Spring 2025.04.06

[Spring][Core] 3-3. Container: Using JSR 330 Standard Annotations

1. JSR-330 표준 어노테이션 사용Spring은 JSR-330 표준 어노테이션(의존성 주입)을 지원합니다.Spring은 이 어노테이션들을 Spring 어노테이션과 동일한 방식으로 스캔하여 사용합니다.이를 사용하려면 관련된 JAR 파일이 클래스패스에 있어야 합니다. 의존성 추가 (Maven) jakarta.inject jakarta.inject-api 2.0.0 2. @Inject와 @Named를 사용한 의존성 주입어노테이션용도설명@Inject의존성 주입- @Autowired와 동일한 기능- required 속성이 없고, Optional 또는 @Nullable과 함께 사용 가능. - Provider와 함께 사용하면 지연 로딩 및 짧은 범위의 빈을 처리할 수 있음.@Named빈의 이름을..

Spring/Spring 2025.04.06

[Spring][Core] 3-2. Container: Classpath Scanning and Managed Components

1. XML 없이 빈 정의클래스패스 스캔Spring은 자동으로 후보 클래스를 탐지하고 이를 빈으로 등록할 수 있음XML 구성이 아닌 어노테이션으로 지원함 2. Bean Annotation메타 어노테이션어노테이션설명용도@ComponentSpring 관리 빈을 정의하는 일반적인 어노테이션모든 컴포넌트 클래스@Repository영속성 계층을 담당하는 클래스에 사용예외 자동 변환 지원데이터 액세스 객체(DAO) 클래스@Service서비스 계층을 담당하는 클래스에 사용서비스 클래스@Controller웹 계층(Spring MVC)을 담당하는 클래스에 사용웹 컨트롤러 클래스 복합 어노테이션어노테이션사용된 메타 어노테이션설명@RestController@Controller, @ResponseBodyREST API 컨트롤..

Spring/Spring 2025.04.06

[Spring][Core] 3-1. Container: Annotation-based Configuration

1. Using @Autowired주입 방식주입 방식설명특징Constructor 생성자를 통해 의존성 주입✅ 추천 방식 (불변성 보장)✅ Spring 4.3+에서는 생성자 1개일 경우 @Autowired 생략 가능Settersetter 메서드를 통해 주입🔸 선택적 의존성이나 테스트에 유용🔸 public/protected 접근 필요Method Argument일반 메서드에 여러 의존성을 한번에 주입🔸 구성 로직과 함께 의존성 주입 가능Field필드에 직접 주입🔸 코드 간결🔸 테스트/DI 프레임워크에서 불편🔸 private이기 때문에 리플렉션 사용Mix (혼용)상황에 따라 적절한 방식 섞어 사용🔸 가능하지만 혼용은 가독성/유지보수성 저하 가능🔸 일관된 스타일 권장 속성속성명기본값설명비고requi..

Spring/Spring 2025.04.06

[오브젝트] 9. 유연한 설계

조영호 님의 "오브젝트" 책을 정리한 글입니다. 1. 개방-폐쇄 원칙컴파일타임 의존성을 고정시키고 런타임 의존성을 변경하라개방-폐쇄 원칙기존의 코드를 수정하지 않고도 애플리케이션의 동작을 확장할 수 있는 설계컴파일타임 의존성은 유지하면서 런타임 의존성의 가능성을 확장하고 수정할 수 있는 구조 추상화가 핵심이다항목내용핵심추상화에 의존하는 것확장 방식상속을 통해 생략된 부분을 구체화확장의 기반추상화는 생략된 부분을 통해 확장의 여지를 남김폐쇄를 가능하게 하는 요소의존성의 방향의존성 방향이 향해야 할 곳구현이 아닌 추상화 계층 public abstract class DiscountPolicy { private List conditions = new ArrayList(); public DefaultD..

Code/OOP 2025.04.05

[오브젝트] 8. 의존성 관리하기

조영호 님의 "오브젝트" 책을 정리한 글입니다. 1. 의존성 이해하기변경과 의존성의존성함께 협력하는 객체들 사이에 발생하는 관계구분설명구현 시점- 의존 대상 객체가 변경되면, 의존하는 객체도 함께 변경될 가능성이 있음실행 시점- 의존 객체가 정상 동작하려면, 의존 대상 객체가 반드시 존재해야 함방향성- 항상 단방향임 (의존 A → B: A는 B에 의존하지만, B는 A에 의존하지 않음)변경 전파- 의존 방향을 따라 변경이 전파됨 (즉, B가 바뀌면 A도 영향 받을 수 있음) 예시더보기public class PeriodCondition implements DiscountCondition { private DayOfWeek dayOfWeek; private LocalTime startTime; ..

Code/OOP 2025.04.04

[오브젝트] 6. 메시지와 인터페이스

조영호 님의 "오브젝트" 책을 정리한 글입니다. 1. 협력과 메시지구분정의구성 요소 / 특징예시메시지객체 간 협력을 위한 의사소통 매커니즘오퍼레이션 명 + 인자order.place(item)메시지 전송한 객체가 다른 객체에게 메시지를 보내는 행위메시지를 전달함A 객체가 B 객체에게 place() 메시지 전송메서드메시지를 수신했을 때 실행되는 실제 절차내부 구현 중심public void place(Item item) { /* 처리 로직 */ }오퍼레이션객체가 외부에 제공하는 추상적인 서비스인터페이스에 정의된 메시지(구현 제외)place(item)퍼블릭 인터페이스외부에 노출된 오퍼레이션들의 집합오퍼레이션 목록place(item), cancel(orderId) 등시그니처오퍼레이션의 명세오퍼레이션 명 + 파라미..

Code/OOP 2025.04.04

[오브젝트] 5. 책임 할당하기

조영호 님의 "오브젝트" 책을 정리한 글입니다.1. 책임 주도 설계를 향해데이터보다 행동을 먼저 결정하라객체에게 중요한 것은 데이터가 아니라 행동 (곧 객체의 책임을 의미함)객체는 협력을 위한 존재이기 때문 협력이라는 문맥 안에서 책임을 결정하라개념설명책임 할당 원칙- 메시지를 먼저 결정한 후 객체를 선택해야 함 - 즉, 메시지가 객체를 결정함설계 순서✅ 메시지 → ✅ 행동(책임) → ✅ 상태(데이터)장점- 캡슐화를 지키기 훨씬 쉬움 책임 주도 설계책임부터 정한 후, 책임을 담당할 객체를 결정하는 것책임이 어느정도 정리될 때까지 내부 상태에 대해 관심을 가지지 않음 2. 책임 할당을 위한 GRASP 패턴도메인 개념에서 출발하기설계 시작 전, 도메인에 대한 개략적인 모습을 그려 보기항목내용방법도메인 개념들..

Code/OOP 2025.04.03

[오브젝트] 4. 설계 품질과 트레이드오프

조영호 님의 "오브젝트" 책을 정리한 글입니다.1. 데이터 중심의 영화 예매 시스템데이터를 준비하자데이터 중심의 설계객체 내부에 저장되는 데이터를 기반으로 시스템을 분할하는 방법객체 내부에 저장해야 하는 "데이터가 무엇인가"를 묻는 것으로 시작됨 예제더보기public class Movie { private String title; private Duration runningTime; private Money fee; private List discountConditions; private MovieType movieType; private Money discountAmount; private double discountPercent; pub..

Code/OOP 2025.04.03