Reflection
·
Programming
리플렉션이란구체적인 클래스 몰라도, 런타임에 클래스의 정보(메서드, 필드, 생성자)를 읽고 조작할 수 있게 해주는 기능즉, 런타임에 타입을 동적으로 결정하고 사용할 수 있다.비유하자면, 리플렉션은 문을 모르고 열쇠도 없이 방 안을 들여다보고, 안에 있는 물건도 만질 수 있는 기술이다(보통 코드는 미리 문과 열쇠를 알아야 하지만, 리플렉션은 모른 채로 작동 가능)리플렉션이 필요한 이유프로그램 실행 중 어떤 클래스를 사용할지 모르는 경우Spring DI 컨테이너, ORM 매핑(JPA) 같은 시스템이 필요유연하고 확장 가능한 구조를 만들기 위해어디서 Class 객체를 얻을까Class.forName("클래스명") 호출 시 ClassLoader가 해당 클래스를 JVM 메모리 안에서 찾는다.메모리에 없다면. cla..
macOS에서 Harbor 레지스트리 인증서 설정하기
·
Programming
MacOS에서 Docker 클라이언트가 사설 Harbor 레지스트리 통신하기 위해서 두 가지 주요 인증서 설정 작업이 필요하다.1. Docker 전용 인증서 디렉토리에 CA 인증서 추가mkdir -p ~/.docker/certs.d/192.168.151.109/cp ca.crt ~/.docker/certs.d/192.168.151.109/ Docker 클라이언트가 특정 레지스트리와 통신할 때 사용할 인증서 제공Docker 애플리케이션에만 국한된 설정Docker 자체 인증서 검증 메커니즘에 필요MacOS는 Docker Desktop을 사용하기 때문에 우분투 환경에서 설정하는 경로와 차이가 있다. 우분투 환경에서 설정 한다면 아래 명령어를 사용해야 한다.mkdir -p /etc/docker/certs.d/1..
우분투 Harbor HTTPS 설정을 위한 인증서 생성
·
Programming
Harbor HTTPS 설정을 위한 인증서 생성 과정인증 기관(CA) 인증서 생성테스트 환경이므로 외부 인증 기관 대신 자체 서명(Self-signed) 방식으로 CA 인증서를 생성한다.CA 인증서(ca.crt)는 CA의 개인 키(ca.key)를 기반으로 발급한다.# 인증서 디렉토리 생성mkdir ~/certcd ~/cert# CA 인증서 개인 키 생성openssl genrsa -out ca.key 4096# CA 인증서 생성: CN에 Harbor를 설치할 서버의 IP주소 입력openssl req -x509 -new -nodes -sha512 -days 3650 \ -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=192.168.151.109" \..
Layered Architecture
·
Programming
Layered ArchitectureLayered Architecture는 각 구성 요소들이 '관심사의 분리(Separation of Concerns)'를 달성하기 위해 '책임'을 가진 계층으로 분리한 아키텍처이다. 하나의 계층에 관심사가 여러 개가 존재한다면 해당 계층의 응집도가 떨어지고 결합도가 높아진다. 관심사의 분리를 통해 재사용성과 유지보수성을 높일 수 있다.구성Presentation사용자의 요청을 받고 해석해서 Application 영역에 전달하거나 처리 결과를 받아서 사용자가 이해할 수 있는 형식으로 변환해서 응답Application사용자에게 제공해야 할 기능을 구현이 기능들을 구현하기 위해 도메인 영역의 도메인 모델을 사용한다.즉, 도메인 모델에 로직 수행을 위임한다.Domain핵심 로직..
JVM 메모리 영역(Method Area, Call Stack, Heap)
·
Programming/Java
보호되어 있는 글입니다.
Resource 추상화
·
Programming/Spring
Resource 추상화Spring은 java.net.URL을 org.springframework.core.io.Resource로 감싸서 추상화한 클래스이다.스프링 내부에서 많이 사용하는 인터페이스이다추상화 한 이유java.net.URL 이 기본적으로 여러 prefix를 지원하는 프로토콜은 http,https, ftp, file, jar이지만 classpath 기준으로 리소스를 읽어오는 기능이 없다.ServletContext를 기준으로 상대 경로로 읽어오는 기능이 없다.새로운 핸들러를 등록하여 특별한 URL 접미사를 만들어 사용할 수는 있지만 구현이 복잡하고 편의성 메소드가 부족하다.ApplicationContext스프링의 핵심 인터페이스:단순히 빈 팩토리로서의 역할뿐만 아니라, 리소스 로딩 기능을 포함하..
ApplicationEventPublisher
·
Programming/Spring
ApplicationContext는 ApplicationEventPublisher 인터페이스를 구현하고, 이를 통해 스프링 애플리케이션에서 이벤트를 발행(publish)할 수 있는 기능을 제공한다.Spring 4.2 버전 이전 버전에서는 발행되는 Event 객체가 ApplicationEvent로부터 확장되고 (extends), EventListener 객체는 ApplicationListener 를 구현해야(implements) 했었다.public class ExampleEvent extends ApplicationEvent { private int data; public ExampleEvent(Object source, int data) { super(source); ..
@Component와 @Bean
·
Programming/Spring
@Component와 @Bean의 차이특징@Component@Bean사용 위치클래스 레벨메서드 레벨자동 감지스프링의 컴포넌트 스캔으로 자동 감지 가능스프링이 명시적으로 메서드를 호출하여 빈 생성소스 코드 의존성클래스의 소스 코드가 수정 가능해야 사용 가능제3자 라이브러리 클래스에도 적용 가능유연성간결하지만 인스턴스 생성 로직에 대한 제어 제한로직 추가를 통해 다양한 조건에 따른 빈 생성 가능@Component는 수정 가능한 클래스에만 적용될 수 있다는 점이 의문이 들었지만, 외부 라이브러리 클래스는 코드 수정이 불가능하므로 @Component 애노테이션을 붙일 수 없다는 점을 생각하면 당연하다. 따라서, 외부 라이브러 클래스는 @Bean을 통해 빈 생성이 가능하다.BeanExample might repr..
Autowired
·
Programming/Spring
@Autowired 빈 주입 방식 3가지생성자필드Setter@Autowired와 빈 주입 과정 이해@Autowired로 빈을 주입할 때, required = false 옵션을 사용하면 빈 주입이 이루어지지 않아도 객체가 생성될 수 있다. 하지만 생성자 주입 방식은 주입할 빈이 반드시 필요하므로, 주입 대상 빈이 없으면 객체 생성에 실패한다.@Componentpublic class ExampleService { private final DependencyService dependencyService; // 생성자 주입 @Autowired public ExampleService(DependencyService dependencyService) { this.dependency..
ApplicationContext 2가지 빈 설정 방식
·
Programming/Spring
ApplicationContext의 빈 설정 방식ClassPathXmlApplicationContext:XML 파일을 통해 Spring 빈을 정의하고 로드하는 과거 방식입니다.주로 applicationContext.xml과 같은 파일에서 빈 정의를 작성했습니다.AnnotationConfigApplicationContext:Java 기반의 빈 설정을 사용하는 방식입니다.XML 대신 자바 클래스를 사용하여 빈을 정의하고 구성합니다.Java 기반 빈 설정자바로 빈을 등록할 때는 @Configuration과 @ComponentScan 애너테이션을 활용합니다.@Configuration: 설정 클래스를 나타냅니다. 이 클래스는 하나 이상의 @Bean 메서드를 포함하며, 이러한 메서드들이 생성하는 객체를 Spring..