본문 바로가기

전체 글

(208)
의존관계주입 의존 관계 주입 내부 빈 빈 의존관계를 여러 빈이 공유하지 않는다면 의존관계를 내부 빈으로 만든것을 고려할 수 있다. 내부 빈은 해당 내부 빈 정의를 둘러싸고 있는 빈 정의 안에서만 접근할 수 있다. 스프링 컨테이너에 등록된 다른 빈들은 내부 빈을 사용할 수 없다. 내부 빈 정의에 해당하는 엘리먼트는 id 속성을 지정하지 않는다. 내부 빈은 항상 프로토타입 스코프 빈이기 때문에 내부 빈에 해당하는 엘리멘트에 scope 속성이 들어있어도 이를 무시한다. depends-on 속성을 통해 빈 초기화 순서 제어하기 A빈이 B빈을 생성자 인수로 받는다면, 스프링 컨테이너는 A를 생성하기 전에 B를 생성한다. 이때 XML 파일에 두 빈이 정의된 순서는 무시된다. 스프링 컨테이너가 이런식으로 작동하기 때문에 어떤 빈..
빈 설정 스프링 프레임워크 기초 정적 팩토리 메서드와 인스턴스 팩토리 메서드로 빈을 생성하는 방법 스프링 컨테이너는 인수가 없는 생성자 지원 여부에 상관없이 클래스의 인스턴스를 만들고 관리할 수 있다. 팩토리 클래스를 사용해 객체 인스턴스를 만드는 기존 자바 애플리케이션 있는경우, 스프링 컨테이너를 사용해 팩토리가 만든 객체를 관리할 수 있다. 정적 팩토리 메서드로 빈 초기화 public class FixedDepositDaoFactory { private FixedDepositDaoFactory() {} public static FixedDepositDao getFixedDepositDao(String daoType) { FixedDepositDao fixedDepositDao = null; if ("jdbc"..
자바 코딩의 기술 - #7 객체 디자인 불 매개변수로 메서드 분할 일반적으로 메서드는 하나의 작업에만 특화되어야 한다. 불 메서드 매개변수는 메서드가 적어도 2가지 작업을 수행함을 뜻한다. class Logbook { private final Path CAPTAIN_LOG = Paths.get("/var/log/captain.log"); private final Path CREW_LOG = Paths.get("/var/log/crew.log"); void log(String message, boolean classified) throws IOException { if (classified) { writeMessage(message, CAPTAIN_LOG); } else { writeMessage(message, CREW_LOG); } } vo..
병렬 프로그래밍 병렬 프로그래밍 여러가지 일을 동시에 처리하기 위한 기법은 크게 병행(Concurrency), 병렬(Parallel) 그리고 분산(Distribute)으로 구분한다. 병행은 하나의 CPU 코어에서 소프트웨어적인 기법으로 동시에 여러 작업을 교차하면서 실행하는것. (프로그램 성질) 병렬은 여러 개의 코어에 작업을 배분해서 동시에 작업을 실행하는 것. (기계적인 특징) 멀티코어 환경에서 병렬과 병행 작업이 동시에 일어난다. 작업이 여러 코어에 배분될뿐만 아니라 하나의 코어에서 여러 작업이 병행해서 동작한다. 컨커런트 API 웹 기반 개발이 일반화 되면서 멀티 스레드 프로그래밍이 강조 되었다. 컨커런트 API가 멀티 스레드 모델보다 개발이 좀 더 쉽긴 하지만 멀티 스레드를 대체하기 위한 것은 아니다. 데몬 프..
이펙티브 자바 # 3 클래스와 멤버의 접근권한을 최소화 잘 설계된 컴포넌트의 차이점은 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼는지에 달려있다. 오직 API를 통해서만 다른 컴포넌트와 소통하며, 서로의 내부 동작 방식에는 전혀 개의치 않는다. 정보 은닉 or 캡슐화 장점 시스템 개발 속도(여러 컴포넌트를 병렬로 개발 가능) 시스템 관리 비용 낮춤(각 컴포넌트를 더 빨리 파악하여 디버깅 할수 있고, 다른 컴포넌트로 교체하는 부담이 적음) 정보은닉 자체가 성능을 높여주지 않지만, 성능 최적화에 도움(다른 컴포넌트에 영향을 주지 않고 해당 컴포넌트만 최적화 가능) 소프트웨어 재사용성을 높임 큰 시스템을 제작하는 난이도를 낮춤(시스템 전체가 완성되지 않는 상태에서도 개별 컴포넌트의 동작을 검증 가능)..
이펙티브 자바 #1 생성자 대신 정적 팩터리 메서드를 고려하라 장점 이름을 가질수 있다. 호출될 때 마다 인스턴스를 새로 생성하지 않아도 된다. 반환 타입의 하위 타입 객체를 반환할수 있다. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다. 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래가 존재하지 않아도 된다. Date d = Date.from(instant); Set fceCards = EnumSet.of(JACK, QUEEN, KING); BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE); StackWalker luke = StackWalker.getInstance(options); Object newArray = Array.newInsta..
스프링 부트 기본설정 및 기본 테스트 gradle 설정 build.gradle buildscript { ext { springBootVersion = '2.1.7.RELEASE' } repositories { mavenCentral() jcenter() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' group 'com.swan.ee' version '1.0-SNAP..
Swagger-UI url 변경 @Configuration @EnableSwagger2 @Import(BeanValidatorPluginsConfiguration.class) public class SpringFoxConfig extends WebMvcConfigurationSupport{ @Bean public Docket apiDocket() { return new Docket(DocumentationType.SWAGGER_2) .useDefaultResponseMessages(false) .select() .apis(RequestHandlerSelectors.basePackage(CommonConstants.BASE_PACKAGE_NAME)) .paths(PathSelectors.ant("/api/v1/**")) .build() ..