2021 11 16
2021-11-16¶
Gradle 멀티 모듈 기초¶
- 미션 요구사항 - 컨텍스트 간의 독립된 모듈로 만들 수 있음 - 의존성 주입, HTTP 요청/응답, 이벤트 발행/구독 등 다양한 방식으로 모듈 간 데이터 주고 받을 수 있음
- 참고: https://jojoldu.tistory.com/123
- 프로젝트 분리? - 일정 수준 이상의 트래픽을 감당하려면 분리해야함 - 그럼 여기저기서 사용되는 클래스들은 어찌하지? 1. 복붙 - 실수할 여지 너무 많음 2. 공통 프로젝트를 두고, 해당 프로젝트를 여러 프로젝트에서 가져가서 사용 - 개발시에는 바로바로 공통 프로젝트 코드를 사용할 수 있어야 함 - 빌드시에는 자동으로 공통 프로젝트가 포함되어야 함 - Gradle의 Multi Module 방식을 사용하여 해결 가능
- 예시
-
- 루트: gradle-multi-modules- 하위:module-api- 하위:module-web- 하위:module-common<= 이놈이 공통 클래스 모아둔 프로젝트 - 루트에서만 빌드하기 때문에, 루트에서만 gradle 폴더/gradlew 파일이 있음 - 실습 -module-common에서 Member 엔티티, MemberRepository 작성 -module-api에서 MemberService 작성 -gradle-multi-modules의settings.gradle에서 아래 코드 추가- `gradle-multi-modules` 의 `build.gradle` 을 다음과 같이 수정 - `subprojects` : `settings.gradle`에 include 된 프로젝트 관리 - `project()` : 하위 프로젝트간의 의존성 관리 ``` buildscript { ext { springBootVersion = '1.5.1.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") classpath "io.spring.gradle:dependency-management-plugin:0.6.0.RELEASE" } } subprojects { group 'com.blogcode' version '1.0' apply plugin: 'java' apply plugin: 'spring-boot' apply plugin: 'io.spring.dependency-management' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' } } project(':module-api') { dependencies { compile project(':module-common') } } project(':module-web') { dependencies { compile project(':module-common') } } ```
- 참고: https://velog.io/@sangwoo0727/Gradle%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%A9%80%ED%8B%B0-%EB%AA%A8%EB%93%88
- 왜 필요하지? - 독립적인 프로젝트 만들었는데, 여기서 겹치는 클래스들 다수 발생 - api 서버에도, 배치 서버에도 Member 엔티티가 필요
- 멀티 모듈 - 독립된 프로젝트 단위이기 때문에, 도메인 공유가 불가 - 같은 도메인을 프로젝트에 두곤햇어... - 멀티 모듈 도입하면 독립적인 프로젝트를 하나의 프로젝트 안의 "모듈" 로서 가짐
- 과정
- 새로운 프로젝트 생성
- Gradle 이용하여 프로젝트 만듦
- 신규 모듈 생성
- New - Module 을 선택해 Gradle 모듈 생성
- 기존 Root 프로젝트의 src 폴더 삭제
- 각 모듈에는
build.gradle과 src 만 존재하도록 - 각 모듈에 필요한 의존성 추가 - 하위 모듈... boot jar = false, jar = true- 각각의 모듈의 역할에 맡는 의존성 주입- root 프로젝트의
build.gradle- subprojects : settings.gradle에 포함된 프로젝트를 관리하는 곳 - 루트까지 적용할라면 allprojects로 작성subprojects { group 'io.hala' version '1.0' apply plugin: 'java' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' sourceCompatibility = 11 repositories { mavenCentral() } dependencies { compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' implementation 'org.springframework.boot:spring-boot-starter-test' } }- project() : 하위 의존성 관리 - `module-api` 와 `module-batch` 에서 `module-common` 추가해 줌 (`module-common` 사용가능) ``` project(':module-api') { dependencies { compile project(':module-common') } } project(':module-batch') { dependencies { compile project(':module-common') } } ```
코어 자바스크립트 [3장. this]¶
- 1. 상황에 따라 달라지는 this - JS에서 this는 기본적으로 실행 컨텍스트가 생성될 때 함께 생성 - JS의 모든 변수는 특정 객체의 프로퍼티로 동작 - 따라서 전역변수를 선언하면 JS 엔진은 이를 전역객체의 프로퍼티로 할당 - 함수 vs 메서드 - 함수 앞에 (.) 이 있다면 메서드! - this에는 호출한 주체에 대한 정보가 담김 - 즉 점 표기법의 경우, 마지막 점 앞에 명시된 객체가 this - 객체 내부의 함수를 함수로서 사용하는지, 메서드로서 사용하는지를 파악하면 this를 알 수 있음 - this 바인딩 오직 해당 함수를 호출하는 구문 앞에 점/대괄호가 있는지 없는지가 관건 - ES6의 Arrow Function은 this 바인딩 과정이 없다! - 따라서 상위 스코프의 this를 그대로 사용 - 콜백 함수에서 this - 기본적으로 전역 객체 참조 - 제어권을 받은 함수에서 콜백 함수에 별도로 this 지정하면, 그 대상 참조
- 2. 명시적으로 this 바인딩하기
- call 메서드
-
Function.prototype.call(thisArg[, arg1[, arg2[, ...]]])- 메서드의 호출 주체인 함수를 즉시 실행 - 첫번째 인자를 this로 바인딩 - apply 메서드 -Function.prototype.apply(thisArg[, argsArray])- call과 비슷 - 두번째 인자를 배열로 받아 매개변수로 지정 - bind 메서드 -Function.prototype.bind(thisArg[, arg1[, arg2[, ...]]])- this 및 인수들을 바탕으로 새로운 함수 반환 - Arrow Function - 함수 안에 this가 없음 - 스코프체인상 가장 가까운 this에 접근 - 콜백 함수 내에서의 this - 인자로 받는 메서드 중 일부는 this로 지정할 객체를 인자로 지정 가능Array.prototype.forEach(callback[, thisArg]) Array.prototype.map(callback[, thisArg]) Array.prototype.filter(callback[, thisArg]) Array.prototype.some(callback[, thisArg]) Array.prototype.every(callback[, thisArg]) Array.prototype.find(callback[, thisArg]) Array.prototype.findIndex(callback[, thisArg]) Array.prototype.flatMap(callback[, thisArg]) Array.prototype.from(callback[, thisArg]) Set.prototype.forEach(callback[, thisArg]) Map.prototype.forEach(callback[, thisArg])