콘텐츠로 이동

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-modulessettings.gradle 에서 아래 코드 추가
    rootProject.name = 'gradle-multi-modules'
    include 'module-common', 'module-api', 'module-web'
    
      - `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')
          }
      }
      ```
    

  • 멀티 모듈 - 독립된 프로젝트 단위이기 때문에, 도메인 공유가 불가 - 같은 도메인을 프로젝트에 두곤햇어... - 멀티 모듈 도입하면 독립적인 프로젝트를 하나의 프로젝트 안의 "모듈" 로서 가짐
  • 과정 - 새로운 프로젝트 생성 - Gradle 이용하여 프로젝트 만듦 - 신규 모듈 생성 - New - Module 을 선택해 Gradle 모듈 생성 - 기존 Root 프로젝트의 src 폴더 삭제 - 각 모듈에는 build.gradle과 src 만 존재하도록 - 각 모듈에 필요한 의존성 추가 - 하위 모듈... boot jar = false, jar = true
    bootJar  {  enabled = false }
    jar  {  enabled = 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])