5/21 maven

박세현·2024년 5월 21일
0

3차 프로젝트

목록 보기
3/14
post-thumbnail

maven

  • 빌드, 의존성(필요한 라이브러리 jar(Java Archive))관리, 배포, 테스트 툴

참고)
npm
yarn

1. 설치

maven apache
https://maven.apache.org/

압축해제

ㄴ 깃에 안올라가게 설정
-* : 버전이 바껴도 안올라게 설정

ㄴ 명령어

ㄴ 경로 굳이 일일이 입력 안해도 명령어 쓸 수 있도록 설정하기
D:\박세현\apache-maven-3.9.6-bin\apache-maven-3.9.6\bin] : 이름 파일 경로 넣어주기

ㄴ 잘 설정됬는지 쳌

ㄴ 파일 이동
mvn archetype:generate : maven 프로젝트 생성 할 수 있게 무슨 창 뜨는??

ㄴ 엔터 2번 누르기

ㄴ 입력하고 엔터

ㄴ 프로젝트 식별명칭 : exam01 엔터
ㄴ 그냥 엔터

ㄴ 그냥 엔터 : 그룹아이디랑 동일한 패키지명 쓰기로
artifactId : 프로젝트 구분 할 수 있는 아이디

ㄴ y 엔터

ㄴ trust 프로젝트

2. 사용

1) maven 프로젝트 생성

  • mvn archetype:generate
  • groupId : 소속된 그룹(도메인 방식)
    예) org.project
  • artifactId : 프로젝트 구분 명칭

2) 프로젝트 디렉토리 구조

  • 클래스패스 : 클래스 파일을 인식(접근)할 수 있는 경로
    • src/main/java : 작성하는 자바코드(.java)
    • src/main/resources : 정적 자원
      - 설정 파일(xml, properties)
      - css, js, 이미지

    • src/test/java : 테스트 자바 코드(.java)
    • src/test/resources : 테스트시 필요 정적 자원

  • main -> main ⭕
  • main -> test ⭕
  • test -> test ⭕
  • test -> main ❌

예시)

ㄴ 접근 가능 = main에서 test로 접근가능

ㄴ 접근가능 = test끼리 접근 가능

ㄴ 접근❌ = test에서 main으로는 접근불가




3) pom.xml

  • pom.xml : maven 설정 파일

참고)
node : package.json 파일과 동일한 역할

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> : 소스 인코딩 
  <maven.compiler.source>17</maven.compiler.source> : 소스 컴파일 자바 버전
  <maven.compiler.target>17</maven.compiler.target> : 배포 파일(jar) 생성시 자바 버전
</properties>


① 의존성 설정

<dependencies>

</dependencies>	
  • 사용자명/.m2 -> 메이븐 레포지토리 (공유)

예시)

ㄴ 선언자

ㄴ source : 작업시 버전
ㄴ target : 배포시 버전 (maven을 가지고 build할 때)

ㄴ 의존성



예시) 사용자명/.m2 -> 메이븐 레포지토리 (공유)

ㄴ jar : 자바 아카이브, 클래스 파일들이 포함되어 있다



② scope

  • compile (기본값) : 빌드시 포함, 배포시 포함
  • runtime : 빌드시 포함 X, 실행할때는 필요한 라이브러리(동적 로딩 - Class.forName(...))
  • provided : 개발시에만 필요, 빌드 및 배포시에는 미포함 -> 플랫폼 내에서 제공되는 라이브러리
    예) servlet-api, servlet.jsp-api
  • test : 테스트 시에만 필요한 라이브러리



4) mvn 명령어

  • mvn clean compile : 기존 컴파일 소스 삭제 후 다시 컴파일

    • mvn compile : java 파일 -> class 컴파일 (target 폴더)

    • mvn clean : 컴파일 소스 전체 지우기(target 폴더 삭제)

    • clean 하고 compile하는게 좋음
      -> mvn clean compile

  • mvn test : 테스트 케이스를 실행(전체)

  • mvn package : 배포 파일 생성(jar)
    내부적으로 : compile -> test -> package(jar)
    -> 테스트 미통과시 배포 X

    • mvn) 기존 컴파일 소스 삭제 후 배포 실행
      mvn clean package
    • jar 파일 실행
      java -jar 파일명.jar
  • CTRL + SHIFT + B

  • 버전 표기법
    1 .18. 32
    (Major) (Minor) (Patch)

    • Major : 기존 버전과 호환되지 않은 버전
      -> 호환❌
      -> Major가 바껴있다...호환이 안될 가능성이 매우 높다
    • Minor : 호환성에는 문제가 없는 기능 추가, 수정
      -> 호환은 되지만 기능 추가나 수정이 있을 대 이 버전이 올라간다
    • Patch : 코드의 오류, 버그, 수정이 있는 경우
  • lombok.jar :get, set, toString...이런거 자동으로 기능 가져오기...?

    • @Getter
    • @Setter
    • @ToString
    • @EqualsAndHashCode
    • @Data : @Getter, @Setter, @ToString, @EqualsAndHashCode
      -> @Data : 데이터 애노테이션이 위 4가지 애노테이션 다 포함되어 있음
      -> 일일이 할 필요없이 @Data로 하면 됨

    • @NoArgsConstructor : 기본 생성자
    • @AllArgsConstructor : 모든 멤버 변수로 초기화 생성자
    • @RequiredArgsConstructor : 필수 멤버 변수를 생성자 매개변수로 추가
      • @NonNull : 생성자 매개변수로 추가, null허용x
      • 멤버변수를 final(상수)로 정의한 경우, 값을 대입하지 않은 경우

    • @TosString.Exclude : toString()에 추가 배제
    • @TosString.Include : toString()에 추가

    • @Builder : 빌더 패턴으로 자동 생성
      • 빌터 패턴? 값을 설정 -> 객체를 내부에서 생성 패턴
      • 내부에서 객체를 생성(외부에서 객테x) = 생성자 접근제어자가 private으로 되어 있음
      • set()의 경우 외부에서 객체생성하고 값 변경하는데
      • 빌더는 내부에서 객체생성하고 값 변경
  • maven central(공식) : 의존성 저장소

    참고) maven central repository
    https://central.sonatype.com/

  • mvnrepository(비공식) : 의존성 저장소, 이걸 더 많이 사용

    참고) mvnrepository
    https://mvnrepository.com/


예시) 컴파일
1번 방법

2번 방법

↓ 컴파일 하면 컴파일한 모든 클래스 파일이 target으로 감

ㄴ 컴파일한 파일들은 target에 존재하게 됨



예시) 컴파일한거 지우기

ㄴ target 없어짐



예시) 이렇게 컴파일 하는게 일반적

ㄴ 클래스파일을 컴파일 할 대 덮어씌우는 형식으로 컴파일 되서 이렇게 해야한다...



예시) 테스트_mvn test



예시) mvn clean package

ㄴ 이게 실행 될 거 : 실행 될 애플리케이션

ㄴ target으로 옮기기
ㄴ 애플리케이션 실행



예시) 메이븐 설치안하고 하는 법

ㄴ sync

ㄴ 명령어 입력



예시) 인텔리제이 기능을 활용해서 메이븐 프로젝트 생성

mvn archetype:generate : 메이븐 프로젝트 생성
-> 이거 구찮
-> 인텔리제이 기능을 활용해서 메이븐 프로젝트 생성하자
ㄴ 단, 의존성은 직접 다시 작성해줘야 함

ㄴ 의존성 정의
ㄴ 예시) 메이븐 레포지토리(비공식) 참조해서 의존성 코드 붙여넣기
ㄴ sync 누르기



예시) 메이븐 레포지토리(공식) + 롬복 의존성 설치



예시) 메이븐 레포지토리(비공식)

ㄴ 많이 쓰는거 선택해서 다운받기

ㄴ 의존성 붙여 넣자ㅏㅏㅏ



예시)

ㄴ 어플라이 -> 오케이 누르기



예시) 버전

ㄴ 버전 표기법 참조



예시) 롬복 써보기

ㄴ 데이터 클래스

ㄴ 인텔리제이 제너레이트도 구찮다
ㄴ 롬복 활용해서 애노테이션 쓰면 자동으로 추가

ㄴ 진짜 애노테이션 통해 됬는지 테스트 하고 싶어
ㄴ 직접 소스쪽에 하지 말고 test에서 하자
ㄴ test쪽은 배포할 때 포함되지 않기 때문에 소스 테스트하기 좋음
ㄴ 아 근데 의존성 추가 해줘야 함

ㄴ R, M붙은거는 실험적인게 들어있을 수도 있음

ㄴ 복붙

ㄴ 코드 작성

ㄴ 보통 Plugin은 백그라운드 파일

ㄴ 복붙

ㄴ sync 눌러주기(빨간글씨 사라짐)
ㄴ test를 위한 의존성 추가 완
ㄴ 이제 애노테이션으로 롬복 기능한거 테스트 해보자

ㄴ 오 애노테이션 하니가 자동으로 안보이지만 재정의 해줬넹
-> get(), set() 보이넹

ㄴ 출력해볼까나

ㄴ 음 toString이 재정의 안됬넹

ㄴ toString 도 추가

ㄴ 이제 값으로 잘 나오는군 ㅎㅅㅎ

ㄴ 동등성 비교도 추가~

ㄴ 출력

ㄴ @Data만 해도 겟, 셋, 투스트링, 이콜스앤해쉬코드 다 들어있음

ㄴ 다 나오네



예시) 롬복_ 생성자 애노테이션

ㄴ 기본생성자 없어서 에러 뜸

ㄴ 기본생성자 추가

ㄴ 에러 사라짐



예시) 생성자 접근제어자 바구기

ㄴ 에노테이션 설정 추가해주기
ㄴ enum상수 형태로

ㄴ 접근제어자 private으로 바껴서 에러 뜸



예시1)@RequiredArgsConstructor_@nonnull에노테이션



예시2) @RequiredArgsConstructor_final

ㄴ 상수(fianl)는 값이 꼭 있어야함 = 초기화 하지 않으면 안됨

ㄴ 1번 방법
ㄴ 상수에 값 대입해줌 = 값 변경불가
ㄴ 오류해결

ㄴ 2번 방법
ㄴ 애노테이션으로 초기화 해 줌
ㄴ non null은 값을 변경 가능

ㄴ 초기화 완



예시) @ToString.Exclude



예시) @Builder 안썻을 때 버전

package member;

import java.time.LocalDateTime;

public class User {

    private String userId;
    private String userNm;
    private String email;
    private LocalDateTime regDt;

    private  User() {}

    public static Builder builder() {
        return new Builder();
    }

    @Override
    public String toString() {
        return "User{" +
                "userId='" + userId + '\'' +
                ", userNm='" + userNm + '\'' +
                ", email='" + email + '\'' +
                ", regDt=" + regDt +
                '}';
    }

    public static class Builder {
        private User user = new User();

        public Builder userId(String userId) {
            user.userId = userId;

            return this;
        }

        public Builder userNm(String userNm) {
            user.userNm = userNm;

            return this;
        }

        public Builder email(String email) {
            user.email = email;

            return this;
        }
        public Builder regDt(LocalDateTime regDt) {
            user.regDt = regDt;

            return this;
        }

        public User build() {
            return user;
        }
    }
}

ㄴ 외부클래스 생성자함수 접근제어자 프라이빗이라 외부에서 객체생성못함
ㄴ 내부클래스를 통해 외부 클래스 객체 생성하고 반환값으로 주소값 내보냄
ㄴ 메서드 체이닝 방식

-> 이거 복잡하지 않닝
-> @Builder 애노테이션 쓰면 자동으로 위 패턴 싹 만들어 줌



예시) @Builder 적용한거

ㄴ User클래스랑 동일한 식 적용됨

ㄴ 위 @Builder 적용안한 식이랑 똑같게 외부에서 객체생성 못함 = User2클래스의 생성자함수 접근제어자가 private

ㄴ 음 근데 애노테이션 통해서 접근제어자 바꾸면 안되낭
-> 안되더라...에러 뜸

ㄴ 편법이 있음
-> 기본 생성자를 꼭 써야 되는 경우 @NoArgsConstructor @AllArgsConstructor

ㄴ @NoArgsConstructor , @AllArgsConstructor
ㄴ 오 편법 쓰니까 외부에서 객체 생성 된당

profile
귤귤

0개의 댓글

관련 채용 정보