![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/dgjnUj/btqFOYimPiu/sjqtX7LCeRivZ1Lu3t2kQ0/img.png)
1. 확장에는 열려있고 수정에는 닫혀 있어라 2. 코드 수정을 하지 않는 방향으로 작성해야 한다. 3. 항상 기능 확장 가능성을 고려하여 설계해야 한다. 4. 확장을 하려면 추상 레이어가 필요하다. 5. 이 원리를 가장 잘 설명해 주는 패턴이 strategy 패턴이다. 아래는 Head First Degisn pattern에 나오는 건데 인터넷에서 찾아서 붙였다. 6. Duck을 확장하기 위해서 FlyBehavior 인터페이스를 사이에 두고 나는 방법에 대한 클래스를 구현하고 있다. 6-1 Duck은 FlyBehavior의 fly()를 호출하면 실제 구현체에 따라서 다른 기능을 사용할 수 있게 된다.
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/8itqH/btqFQ8YbSi7/DK7HM2bIB0PlbT16gLue9K/img.png)
1 이전에 작성한 것이 있긴 한대 내용이 좀 부실해서 다시 정리한다. 2. 스프링 라이프 사이클은 스프링 컨테이너가 어떻게 스프링 빈을 관리하는지에 대한 내용이다. 3. 인터넷을 찾아보면 위의 라이프 사이클에 맞게 작성한 코드가 있어 언제 호출하는지 확인 할 수 있다. 3-1 아래 수 많은 interface가 구현되고 있다. 각각의 인터페이스는 하나 혹은 두 개 정도의 메소드를 가지고 있다. 3-2 sysout안에 어떤 interface의 메소드인지를 명시하였다. 3-3 Aware 인터페이스는 스프링이 프레임워크의 내부적인 동작을 수정하기 위한 기회를 제공한다. 3-4 InitializingBean, DisposableBean은 이벤트에 따라 실행되는 call back 메소드를 제공한다. 3-5 @Pos..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/WmNTZ/btqFP8YUzNT/UV9nJW8L5UvBHlbgq3eVPK/img.png)
1. 스프링 컨테이너에 하나 이상의 동일한 타입의 객체가 존재할 경우 1-1 @Qualifier로 어떤 객체를 사용할지를 명시해 주어야 한다. 1-2 아니면 @Primary로 지정하여 @Qualifier가 없는 경우 기본으로 사용될 객체를 지정해 준다. 2. 사용법 2-1 우선 예제로 사용할 공통 인터페이스와 구현 클래스 두개를 만들었다. 2-1-1 PrimaryGreetingServiceImpl은 @Primary가 지정되어 있어 동일한 타입의 여러 객체가 있을 경우 2-1-1-1 우선 순위를 갖게 된다. // 인터페이스 정의 package pe.pilseong.demodi.services; public interface GreetingService { String sayGreeting(); } // P..
1. SOLID는 객체지향 프로그래밍에서 지켜야 할 더 나은 소프트웨어를 개발을 위한 필수 지침이다. 1-1 5가지의 원리는 의존성 관리에 대해 초점을 맞추고 있다. 1-2 잘못설계된 의존성 관리는 코드 확장과 수정을 힘들게 만든다. 1-3 스프링은 이 의존성에 작성에 대한 최소한의 제약만 제공하기 위한 프레임워크이다. 2. Single Responsibility - 하나의 클래스는 하나의 책임만 가져야 한다는 원리 3. Open Close - 확장에는 열려있고 수정에는 닫혀있어야 한다는 원리 3-0 프로그램의 기능이 확장되거나 변경될 때 기존의 소스는 수정하지 않고 추가로 코드를 작성한다. 3-1 인터페이스를 두고 다양하게 확장 가능하도록 구현 3-2 변경될 것과 고정될 것을 구별한다. 변경될 것은 하..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/6opmH/btqFOYaxWPH/FYWoHX3uk3uiDaB2O8jIwk/img.png)
1. maven wrapper는 빌드하는 컴퓨터에 maven이 없어도 빌드가 가능하게 도와주는 script이다. 2. 이 wrapper를 만드는 방법은 mvn plugin의 goal을 실행하는 것인데 아래처럼 실행하면 된다. $ mvn -N io.takari:maven:wrapper 2-1 문제는 버전인데 원하는 버전을 지정할 수 있어야 한다. 현재는 최신 버전 3.6.3을 사용하는 것을 볼 수 있다. 2-1-1 생성된 .mvn/wrapper 폴더 안의 maven-wrapper.properties 파일이 아래처럼 설정되어 있다. 2-1-2 설정 파일에 이미 url이 지정되어 있기 때문이다. 2-1-3 해결책인 위의 properties의 url을 변경하는 방법과 goal을 실행할 때 버전을 넣어주는 방법이..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bX1vlo/btqFP93u0EA/cRBpunSvEBmUdmTVgoZy6K/img.png)
0. 메이븐의 빌드는 라이프사이클을 구성하는 phase와 phase와 바인딩되는 plugin의 goal로 처리된다. 0-1 라이프사이클의 phase는 plugin의 goal과 바인딩 된 경우는 실행되고 안된 경우는 넘어간다. 0-2 메이븐의 plugin이 아닌 다른 3rd party plugin으로 바인딩 되지 않은 라이프사이클 phase를 처리할 수도 있다. 1. 메이븐은 기본적으로 3개의 라이프 사이클을 가지고 있다. clean, default, site 이다. 1-1 Clean - working directory(즉 src 아래의 파일들)로 부터 파생된 모든 부산물을 정리한다. 1-1-1 기본적으로 plugin 바인딩이 되므로 그냥 실행하면 된다. 1-2 Default - 프로젝트를 빌드하고 dep..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bbV60M/btqFNEj35mZ/xYex0OzPX1ZZnK45COxvMk/img.png)
1. 자바 개발의 표준이라고 생각하면 된다. Maven – Introduction to the Standard Directory Layout Introduction to the Standard Directory Layout Having a common directory layout would allow for users familiar with one Maven project to immediately feel at home in another Maven project. The advantages are analogous to adopting a site-wide look-and-feel. T maven.apache.org
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/dtAL7E/btqFNryqFYQ/K0doKauy7bIFxDDPXuGKkk/img.png)
1. 메이븐은 dependency를 중심으로 구조를 이루고 있다. 2. Dependency라고 하면 Maven프로젝트가 의존하는 artifact를 말한다. 3. Transitive Dependency는 프로젝트에서 의존하는 artifiact의 의존성을 말하는 것으로 3-1 이것 때문에 수많은 층의 구조가 형성된다. 3-2 cyclic dependency는 허용하지 않는데, 즉 A가 B를 의존하고 B가 C를 의존하는데 C가 A를 의존하는 경우이다. 4. Dependency Management는 사용하고 있는 artifact의 버전을 명시하여 그 버전을 사용하도록 하는 기능이다. 4-1 의존하고 있는 artifact가 의존하는 artifact도 지정할 수 있다. 5. Dependency Mediation은 ..
- Total
- Today
- Yesterday
- 도커 개발환경 참고
- AWS ARN 구조
- Immuability에 관한 설명
- 자바스크립트 멀티 비동기 함수 호출 참고
- WSDL 참고
- SOAP 컨슈머 참고
- MySql dump 사용법
- AWS Lambda with Addon
- NFC 드라이버 linux 설치
- electron IPC
- mifare classic 강의
- go module 관련 상세한 정보
- C 메모리 찍어보기
- C++ Addon 마이그레이션
- JAX WS Header 관련 stackoverflow
- SOAP Custom Header 설정 참고
- SOAP Custom Header
- SOAP BindingProvider
- dispatcher 사용하여 설정
- vagrant kvm으로 사용하기
- git fork, pull request to the …
- vagrant libvirt bridge network
- python, js의 async, await의 차이
- go JSON struct 생성
- Netflix Kinesis 활용 분석
- docker credential problem
- private subnet에서 outbound IP 확…
- 안드로이드 coroutine
- kotlin with, apply, also 등
- 안드로이드 초기로딩이 안되는 경우
- navigation 데이터 보내기
- 레이스 컨디션 navController
- raylib
- crud
- Validation
- one-to-one
- Spring
- login
- form
- spring boot
- MYSQL
- 설정
- 상속
- one-to-many
- Angular
- Many-To-Many
- 스프링부트
- WebMvc
- Spring Security
- 하이버네이트
- Security
- 스프링
- RestTemplate
- mapping
- XML
- 외부파일
- Rest
- 자바
- hibernate
- jsp
- 매핑
- 설정하기
- 로그인