슈퍼코딩/주특기(JAVA)

2024.05.20(월) 슈퍼코딩 신입연수원 8주차 Day 1 후기 - annotation, meta programming, gradle

곰돌이볼 2024. 5. 20. 09:15
  • 강의
    • 65강(자바 어노테이션과 메타 프로그래밍) ~ 67강(빌드 도구 Gradle로 프로젝트 만들기)

Annotation


  • java의 annotation
    • 자바 프로그램의 추가적인 정보를 제공하는 메타 데이터
  • 메타 데이터 : 보조 정보
  • @를 사용해서 선언
  • 종류
    • 기본 annotation
      • customer annotation
      • built-in annotation
        • Meta annotation
        • general purpose annotation
  • 용도
    • 컴파일 타임 체크 및 오류 검출
    • 문서화(java docs)
    • 런타임 추가기능 처리 : 메타 프로그래밍에서 사용
  • 컴파일 오류 검출하는 annotation
    • @Override
      • 부모 클래스에 해당 메서드가 없으면 error 발생
      • 메타 정보를 알려주는 annotation이어서 없어도 오류 X
    • @ FunctionalInterface : 메소드 1개 초과 시 error 발생
    • @Deprecate : 곧 삭제할 메서드라는 것을 알려줌
  • 문서화(java docs)
    • java 프로그래밍 언어의 공식 문서화 도구
    • java 클래스, 인터페이스의 세부 정보 확인
    • 커뮤니케이션 가능
  • annotation을 통한 코드 문서화
    • 터미널 : src가 있는 위치로 이동 → javadoc -d ./docs -sourcepath src 패키지명 → docs 패키지 생성
      • html 문서 확인
    • @param : 매개변수 설명
    • @return : 리턴값 설명
    • @throws : 에러 설명
/**
 * @param String fileName 파일 이름
   @return String 파일 내용 반환
   @throws IOException 파일을 찾을 수 없는 경우 에러 발생
 */
public static String readFile(String fileName) throws IOException {
	// 파일 읽기
    StringBuilder sb = new StringBuilder();
    try(FileReader fis = ne FileReader(fileName)) {
    	int data;
        while((data = fis.read()) != -1) {
        	sb.append((char) data);
        }
    }
    return sb.toString();
}

meta programming


  • 프로그램의 메타 데이터를 보고 코드를 작성하는 것
  • 주사용 기술
    • custom annotation : 기본 이외 직접 정의한 annotation
    • reflection & class 클래스 : 런타임 때 해당 클래스 메서드와 변수 접근 가능

 

annotation 정의하기(customer annotation)

  • 메타 어노테이션
    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RetnetionPolicy.RUNTIME)
    @Documented
  • 어노테이션 정의
    public @interface MyAnnotation {
  • 어노테이션 속성 : 기본값 설정 기능
    String name(); // a requried attribute
    int count() default 0; // an optioanl attribute with a default value of 0
    // 메서드가 아니라 필드라고 생각하면 됨
// 메타 어노테이션
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetnetionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation { // 어노테이션 정의
    // 어노테이션 속성 : 기본값 설정 기능
    String name(); // a requried attribute
    int count() default 0; // an optioanl attribute with a default value of 0
}

// 사용자 정의 annoatation 사용
@MyAnnotation(name = "설정 파일", count=10)
public void testString() {
...
}
  • Meta annotation
    • @Retentation : 유지 기간
      • RetentionPolicy.SOURCE : 소스 파일(.java)에만 존재하고 클래스 파일 존재 X → 컴파일 사용 X
      • RetentionPolicy.CLASS : 클래스 파일(.class)에만 존재, 실행 시 사용 불가능(default) → 실행 사용 X
      • RetentionPolicy.RUNTIME : 클래스 파일에 존재하고, 실행 시점에도 존재
    • @Target : 적용 대상
      • ElementType.ANNOTATION_TYPE : 어노테이션
      • ElementType.CONSTRUCTOR : 생성자
      • ElementType.FIELD : 필드(멤버 변수, ENUM 상수)
      • ElementType.LOCAL_VARIABLE : 지역 변수
      • ElementType.METHOD : 메서드
      • ElementType.PACKAGE : 패키지
      • ElementType.PARAMETER : 매개변수
      • ElementType.TYPE : 타입(클래스, 인터페이스, enum)
      • ElementType.TYPE_PARAMETER : 타입 매개변수
    • @Documented : javadoc 포함

 

reflection & class 클래스

  • reflection 클래스
    • class 클래스를 통해 가져온 메타 정보를 저장
    • 가져온 클래스 메타 정보를 통해서 클래스의 메서드 실행 가능
  • 코드 예제

Gradle


  • 구현 후처리
    • 코드 실행 검증
    • 외부 라이브러리 종속성 관리
    • java 코드 패키징(jar)
  • Build : java application을 실행할 수 있는 상태
    • java build = java compile + 기타 작업
    • 기타 작업 : java assembly, java test, java depedency management
  • Build tool : 매번 정형화된 빌드 작업 자동화 시스템
    • 정형화된 빌드 작업
      • 컴파일 과정
      • 코드 의존성 관리
      • 코드 테스트 및 리포트
      • 문서화 작업
      • 압축화 파일(.jar) 생성
      • 배포과정 진행
    • 종류
      • Make : 원조 빌드툴
      • Ant : 원조 빌드툴, 최초의 java 특화툴
      • Maven : 빌드툴 혁명
        • xml 사용 및 pom 개념 제시
      • Gradle : 빌드툴의 뜨는 태양
        • 스크립트 언어(= groovy) 사용
  • Maven VS Gradle

Gradle

  •  장점
    • 간결한 스크립트
    • 빠른 빌드 속도 : Maven보다 5배 빠른 속도
    • IntelliJ와 친화력이 좋음
  • 파악해야하는 핵심
    • java gradle 프로젝트 구조
      • project : 최상위 작업 단위
      • module : 자바 코드와 파일을 묶는 작업 단위
      • ./gradle : gradle 명령 파일 모음(=wrapper)
      • ./src : java  코드 및 파일들
        • org.example : java groupt 패키지
        • /main 패키지 : java 실행 코드, 파일 패키지
        • Main.java : java 실행 클래스
        • java 패키지 : java 코드
        • resources : java 코드 이외 코드에 사용되는 파일들
        • /test 패키지 : java 테스트 코드, 파일 패키지
    • java gradle tasks
      • 종류
        • 단일 Task
        • 통합 Task
      • 정형화된 빌드 작업과 task
        • java 컴파일 과정(단일) - other → complieJava
        • java 문서화 작업(통합) - documentation → javadoc
        • java 코드 테스트 및 리포트 - verifiction → check
        • java 압축화 파일(.jar) 생성 - build → jar
        • 빌드 - build → build
      • CLI 하는 법
        • ./src/gradlew에서 명령어를 통해서 task 수행 가능
    • java gradle DSL
      • plugins : gradle task 같은 Gradle 추가 기능 관리
      • groupt, version : Java 모듈 메타 정보
      • repositories : java 외부 라이브러리 저장소
      • dependencies : 사용할 외부 Java 라이브러리 관리
        • External Libraries에 외부 라이브러리 저장됨
        • Maven repository : java 라이브러리
          • https://mavenrepository.com
          • License 중요
      • test : Task Custom 설정 : gradle Task Custom 설정

 

!! 외부 라이브러리 서치해서 활용해보자 !!

 

  • 프로젝트 개선
  1. 기존 코드 정상 실행 확인
  2. 비효율적인 상황 발생
  3. 해결책 구글링
  4. 라이브러리 종속성 추가
  5. 실제 코드에 라이브러리 사용해서 반영
  6. 정상 코드 빌드 동작 확인