Docker 격리 정의 시 : 단일 / 다중 이미지 정의하나의 OS 위 다양한 컨테이너를 조합하여 어플리케이션 구동 가능어플리케이션 = 컨테이너 조합 (컨테이너는 격리된 공간에서 프로세스가 동작하는 기술)단일 컨테이너 어플리케이션 관리: Dockerfile 통한 단일 이미지 구성 및 구동다중 컨테이너 어플리케이션 관리: Docker-Compose 통한 다수 이미지 구성 및 구동Docker Compose 내 다중 컨테이너 사이에서의 network 도커 안에서 컨테이너끼리 network 통신하기 위해 (1) User-defined Bridge, (2) Hostname 2가지가 있음. docker-compose.yml 파일 내 `ports:` 옵션만 준 경우 Spring 에서 MySQL 사용시 어떤 포트 사용..
Docker 왜 사용하는가?1. 일관성 보장2. 다중 컨테이너 지원1. 일관성 보장어플리케이션이 어떤 머신에서도 정상 및 동일 동작하기 위해서는 어플리케이션이 구동되는데 필요한 모든 것들이 아래의 환경과 버전 등이 맞아야한다. -> 이를 일관성이라고 한다.Application 파일환경 변수런타임 환경, 버전서드파티 라이브러리Cut down OS 격리 (Isolation) & 일관성 (Consistency)격리 : 로컬(인스턴스)의 환경과 분리된 도커 환경으로 로컬 환경을 오염 / 충돌하지 않음일관성 : 다양한 로컬(인스턴스)에서도 도커로 일관된 어플리케이션 구동 가능도커가 없다면 로컬(인스턴스)의 환경과 + App 구동을 위한 환경이 충돌하고 이리저리 섞인다.도커가 있다면 로컬(인스턴스)의 환경과 + A..
충돌난 상황featrue/signup-test-api 브랜치에서 로컬에서 작업후 커밋remot에서 featrue/signup-test-api 브랜치의 내용이 변경이후 로컬에서 pull을 하려니까 위 사진과 같이 pull이 되지 않았다. 새로운 커밋을 남기지 않고 pull 할 수 있는 방법인 `rebase` 를 사용해서 문제 해결. 해결 과정git pull 에서 에러가 난 브랜치에서 아래 명령어 실행해서 원격에 수정된 최신 코드를 로컬의 `ref/remotes/origin/{branch_name}`에 받아온다.git fetch 아래 명령을 실행해서 원격 코드 위에 다시 로컬 코드들을 순서대로 쌓는다(커밋)git rebase origin/{branch_name}
pinary[i] = i 자리 이친수를 만들 수 있는 경우의 수pinary[i]는 i-1 자리 이친수 패턴을 그대로 적용할 수 있다.그리고 위 사진을 잘 보면 i 자리 이친수는 i-2 자리 이친수 패턴이 적용된 i -1 자리 이친수에 2가지 경우 (0, 1)가 가능하다. 예를 들어서 i = 5 라고 하면,10000, 1000110101, 10100빨간색으로 칠한 부분이 i = 3 자리인 이친수이다.pinary[i] 는 pinary[i-1]의 경우의 수를 그대로 가져가고, 추가로 pinary[i-2]의 경우의 수가 추가된다. 결국 pinary[i] = pinary[i-1] + pinary[i-2] 가 성립
ExceptionResolverspring(WAS) 내 예외 처리BasicErrorControllerspring 기본 에러 처리 (페이지 기반)스프링부트는 예외가 발생하면 기본적으로 `/error`로 에러 요청을 다시 전달하도록 WAS 설정을 해두었다고 한다.@RequsetMapping에 /error로 매핑된걸 볼 수 있다. 참고로 에러 경로는 properties에서 server.error.path로 변결 가능하다별도의 설정이 없다면 예외 발생시에 BasicErrorController로 에러 처리 요청이 전달된다.HandlerExceptionResolverJava에서는 예외 처리를 위하 try-catch를 사용해야하지만 try-catch를 모든 코드에 붙이는 것은 비효율적임스프링은 예외 처리를 위한 tr..
JSON 반환 시 세부 설정@JsonIncludeJSON 노출 여부에 대한 조건 @JsonInclude(JsonInclude.Include.NON_NULL) `JsonInclude.Include.NON_NULL` 이 외에 더 많은 옵션들이 존재하지만 실제로 NON_NULL을 제외하곤 다양하게 사용 X 실습: @JsonInclude 를 통해 응답으로 노출될 값들에 대한 세부 조율서버 내부 데이터 조작을 위한 Entity 클래스와 외부와의 소통을 위한 DTO 클래스 분리 -> stream 활용해서 User 객체를 value로 가진 hashMap을 UserResponseDto 를 요소로 가진 리스트로 변경 클래스 단위로 null 필드는 JSON에서 제외 @JsonProperty결과 객체 JSON반환 시 ..
이 아키텍처의 목적은 관심사의 분리 (Separation of concern) = 높은 유지 보수성과 쉬운 테스트Presentation Layer간단하게 생각하면 MVC 아키텍처 패턴 부분 전체 Business LayerSpring 프레임워크는 개발자에게 비지니스 구현에만 신경쓰도록 한다. 위 이미지에서 @Service 부분 Data Access Layer비지니스 구현을 위한 데이터 조회와 같이 CRUD 제공 - @Repository@Repository ~= DAO: 이 두 개념은 다르나, Spring에서 혼용해서 쓰기도 한다.DAO와 @Repository 차이DAODB에 직결된 CRUD 함수(구현체는 EntityManager 통해 수행) @RepositoryEncapsulating DAO (DAO 의 ..
MVC 아키텍쳐 패턴 개요Front Controller: URL 에 알맞은 Controller 찾아서 (HandlerMapping) 호출Controller는 ViewTemplate 명칭 및 Model을 반환웹 페이지(HTML) 반환 시: ViewResolver 를 통한 ViewTemplate + Model -> View 생성 및 반환데이터(JSON)반환 시: HttpMessageConverter 를 통해 -> JSON 변환 및 반환 Front Controller 이전의 ServletJava EE 시절Servlet은 요청 URL 마다 할당 되어 개발Java는 거대 웹 어플리케이션 프로젝트를 위해 Java EE 라는 Java 웹 표준 기술을 만들었었다.Java의 웹 표준 중 Java 기반 CGI 프로그램 ..
Spring Boot 의의1. 의존성 관리모든 의존성 신경쓰지 않고, 버전 충돌없이 잘 말아놓은 최상위 패키지 사용 2. 자동 설정의존성 관리에서 꽤 많은 라이브러리들을 내포하게되는데, 이 모든 것에 대한 설정이 문제@SpringBootApplication: Spring Boot 에 필요한 모든것을 세팅 및 기본 설정@SpringBootConfiguration: @Configuration을 통해 추가 @Bean등록 가능@EnableAutoConfiguration: 사전 정의된 라이브러리들에 대한 기본 설정 값@ConponentScan: XML 아닌 @Controller 등 어노테이션 기반 Bean 수집 규칙 정의 Spring 과 Spring Boot의 차이SpringWAR(Web Application A..