Post

Gradle

✅ JAVA build, build tool

✔️ java application 구현 및 실행 준비

☝🏻java application을 만들 때 비즈니즈 핵심 로직, 중요 클래스는 직접 구현
✌🏻 동시에 외부 클래스, 인터페이스 등 JAVA library 활용
🤞🏻 코드가 잘 실행되는지 검증
👌🏻 JAVA 외부 library 종속성 관리, library끼리 꼬이지 않도록(왜냐하면 library끼리 서로를 참조하기 때문)
👍🏻 JAR 이라는 압축 파일로 패키징하여 실행 준비 끝!

✔️ JAVA build

구현 + 실행할 수 있는 상태로 만들기
JAVA build 🟰 JAVA compile 과정 ➕ 기타 작업

  • java compile
    = java dependency management
  • java test
  • java assemply

✔️ JAVA build tool

매번 정형화된 build 작업을 자동화해주는 시스템

  • make
  • ant: java에 특화된 빌드 툴
  • maven: pom.xml에 maven설정
  • gradle: build.gradle에 gradle설정이 되어 있음

🔖 정형화된 빌드 작업 리스트

  • JAVA compile
  • 코드 의존성 관리
  • 코드 테스트 및 리포트
  • 문서화 작업
  • 압축화 파일(.jar) 생성
  • 배포 과정 진행

✅ JAVA Gradle 프로젝트 구조

스크린샷 2024-01-01 오후 4 55 27

스크린샷 2024-01-01 오후 4 58 27

  • Project: 코드, 파일을 묶는 최상위 작업 단위
    Project안에 Module, gradle, src 다 있음
  • Module: 코드, 파일을 묶는 작업 단위
    Module 단위로 build system 이 있음.
  • ./gradle: **gradle 명령 **파일 모음(wrapper)
  • ./src: 기타 파일 모으는 폴더
    여기안에 우리가 코드 작성
    /main 패키지, Main.java가 여기 들었음
    /test 패키지도 있음
  • /main 패키지: java 실행 코드, 파일 패키지
    이 안에 resourse, org.exmaple, Main.java 들어 있다.
  • resourse: 실행, 테스트 할 때 사용되는 java외 파일
    .csv, png, json…
  • org.exmaple: java group 패키지
  • Main.java: 실행 클래스
  • /test 패키지: 테스트 코드, 파일 패키지

✅ JAVA Gradle Tasks

스크린샷 2024-01-01 오후 5 37 59

  • 통합 Task: Task가 어떤 Task에 종속
    앞의 작업이 이루어져야 그 다음 작업이 이루어지고
    앞의 작업이 실패하면 뒤에 작업 이루어지지 않음

  • 단일 Task: 오로지 한 개의 Task
    그림에서 clean

이름 없는 노트북-14

✅ JAVA Gradle DSL: Domain Specific Languages

스크린샷 2024-01-01 오후 5 55 01

build.gradle같은 파일

  • Plugins: gradle 추가 기능 관리
    task 관리
  • group: version: java 모듈 메타 정보
  • repository: java 외부 라이브러리 저장소
    mavenCentral()이라는 곳에서 외부 라이브러리 들고 온다.
  • dependencies: 사용할 외부 java 라이브러리 관리
  • Gradle Task 설정: gradle task custom 설정
    test{} 라는 곳에 쓴다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
plugins {
    id 'java'
    //⭐️ gradle Task 같은 gradle 기능 추가
    //plugin: task를 관리
    id 'maven-publish'
}

group = 'org.example'
version = '1.0-SNAPSHOT'
//⭐️ gradle 변수 선언
//아래 사용해보았음
var jUnitVersion= "5.9.1"

repositories {
    mavenCentral()
}

dependencies {
    testImplementation platform("org.junit:junit-bom:${jUnitVersion}")
    //testImplementation platform("org.junit:junit-bom:5.9.1")
    testImplementation 'org.junit.jupiter:junit-jupiter'
    //⭐️ dependencies 추가
    //external libraries라는 파일에 추가된다.
    // maven repository 라는 사이트에서 들고 온다.
    // https://mvnrepository.com/artifact/com.google.guava/guava
    implementation 'com.google.guava:guava:32.1.2-jre'


}
//⭐️ task custom 설정
//jar, classes 등 option 추가 가능
javadoc{
    //javadoc만들 때 이 파일은 만들지 마. 제외해
    //파일의 source root가져와서 붙이기
    exclude('org/example/Main.java');
}
test {
    useJUnitPlatform()

}

❓ java 라이브러리는 어디에서 들고 오는가?

maven repository 라는 사이트에서 들고 온다.
https://mvnrepository.com/

☑️ JAVA Gradle 사용해서 application 개선하기

  1. 기존 코드 정상적으로 실행되는지 확인
  2. 비효율적인 상황이 발생한다면
  3. 구글링으로 해결책(라이브러리) 찾기
  4. 라이브러리 종속성 추가
  5. 실제 코드에 라이브러리 사용해서 반영
  6. 정상 코드 빌드 동작 확인

    personDTO 라는 객체를 Person으로 바꾸고 싶은데,
    두 객체의 field가
    personDTO는 name이라고 하고 Person은 fullname이라고 하고
    personDTO는 age이라고 하고 Person은 years이라고 하는 상황이다.
    이를 어떻게 name은 fullname이고 age는 years라고 알려줄 수 있을까?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//✅ build.gradle
//build.gradle에 dependencies 추가
// plugins {
//     id 'java'
// }

// group = 'org.example'
// version = '1.0-SNAPSHOT'

// repositories {
//     mavenCentral()
// }

dependencies {
    testImplementation platform("org.junit:junit-bom:5.9.1")
    testImplementation 'org.junit.jupiter:junit-jupiter'
    //⭐️ dependencies 추가
    //객체 간 mapping을 위해 MapStruct core, processor추가
    implementation 'org.mapstruct:mapstruct:1.5.3.Final'
    annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.3.Final'
}

// test {
//     useJUnitPlatform()
// }

//✅ PersonMapStruct interface에 매핑
@Mapper
public interface PersonMapStruct {
    //💡 동작원리: 싱글톤 디자인 패턴
    PersonMapStruct INSTANCE= Mappers.getMapper(PersonMapStruct.class);
    //💡 동작원리: 메타 프로그래밍
    @Mapping(source= "name", target= "fullName");
    @Mapping(source= "age", target= "years");
    Person personDTOtoPerson(PersonDTO personDTO);

}

//✅ main.java
Person person= PersonMapStruct.INSTANCE.personDTOtoPerson(personDTO);
This post is licensed under CC BY 4.0 by the author.