'Dependency'에 해당하는 글 3건

TLSv1 deprecated

Daily/Prog 2021. 11. 24. 01:59

20년이 지나도 멈추지 않는 삽질 이야기.

 

WARN: This connection is using TLSv1 which is now deprecated and will be removed in a future release of Connector/J

 

warning 은 신호등에 비유하면 주황색과 같다. 가도 그만 멈추어도 그만인데 난 될수 있으면 멈추는 스타일이다. 그 바람에 또 소중한 시간들을 낭비한다. 위 경고는 TLSv1 / TLSv1.1 이 deprecated 되었으며, 이 프로토콜을 사용한 연결시 MySQL Connector/J Version 8.0.26 버전부터 발생하는 메시지다.

 

참고: https://docs.oracle.com/cd/E17952_01/connector-j-8.0-relnotes-en/news-8-0-26.html

 

3 Changes in MySQL Connector/J 8.0.26 (2021-07-20, General Availability)

3 Changes in MySQL Connector/J 8.0.26 (2021-07-20, General Availability) Version 8.0.26 is the latest General Availability release of the 8.0 series of MySQL Connector/J. It is suitable for use with MySQL Server versions 8.0, 5.7, and 5.6. It supports the

docs.oracle.com

해결은 간단하다. 난 8.0.27 버전을 사용중이었지만 8.0.26 아래 버전으로 다운그레이드 하면 되는데... 이제부터 삽질 시작이다.



Intellij 에서 gradle + java 프로젝트.

모듈은 두개. DB 와 API.

 

// DB module : build.gradle
dependencies {
    ...
    runtimeOnly 'mysql:mysql-connector-java:8.0.25'
    ...
}

// API module : build.gradle
dependencies {
    implementation project(':DB')
}

 

간단하다. DB 모듈에서 MySQL Connector/J 8.0.25 를 정의하고, API 모듈에서 그걸 가져다 썼다. 하지만 경고는 계속해서 나타났다. External Libraries 를 확인해보니 8.0.25 / 8.0.27 두 개 버전이 모두 import 되어 있었다. cache 문제겠거니 하고 기본적인 캐시 삭제 작업들을 시작했다.

 

  • Invalidate Caches -> Invalidate and Restart
  • Project Settings -> Libraries -> MySQL Connector/J 8.0.27 버전 삭제
  • $USER\.gradle\caches 디렉토리 삭제

 

gradle-library-duplicate

 

하지만 이 짓들을 다 해도 MySQL Connector/J 8.0.27 는 계속해서 살아났고 경고가 콘솔에 도배됐다. Find Usages 에서 확인해보니 API 모듈에서 사용중이란다. DB 모듈에서는 8.0.25 를 불러오는데, API 모듈에서 그걸 불러오면 8.0.27 로 변신한다니 이게 대체 무슨...

 

혹시라도 다른 라이브러리에 중복되어 있는지 dependency tree 도 확인해 봤다.

 

 

(DB)  mysql:mysql-connector-java:8.0.25

(API) mysql:mysql-connector-java:8.0.25 -> 8.0.27

 

다른 곳에서 정의 되어 있는건 한개도 없는데 그냥 바뀌어 버린다.ㅋㅋ

 

한참을 삽질한 끝에 밝혀낸 원인은...

gradle 에 정의한 두개의 플러그인 간에 의존성들이 달라 발생한 문제였다.

결국 재정의 했다...

 

dependencies {
    runtimeOnly 'mysql:mysql-connector-java:8.0.25'
    implementation project(':DB')
}

 

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Spring 의 어플리케이션에서 외부 라이브러리를 사용하려면 필요한 라이브러리(jar 파일) 를 다운받아 런타임시 그것들을 클래스 패스로 가져와야 한다.

Dependency 란 말이 어렵다면 필요한 외부 라이브러리라고 봐도 무방할 듯하다.

Dependency 관리는 외부 라이브러리가 있는 해당 리소스 위치에서 로컬에 라이브러리를 저장하고 클래스 패스에 추가하는 것이다.


Spring 을 사용하려면 필요한 Spring 모듈의 jar 라이브러리 사본을 얻어야 한다.

예를 들어, 웹 어플리케이션을 작성하지 않는다면, spring-web 모듈이 필요하지 않다.

Spring 라이브러리 모듈은 spring-core, spring-webmvc, spring-jms 처럼 spring-* 형식의 이름으로 각각 저장소에 게시된다.



Spring Framework 배포판(RELEASE) 다운로드


  • Maven Central
    Maven 에서 쿼리하는 기본 저장소이며 Spring 이 의존하고있는 많은 공통 라이브러리들도 Maven Central 에서 구할 수 있다. 이 곳에서 Spring 모듈인 jar 의 이름은 spring-*-<version>.jar 형식이며 Maven groupId 는 org.springframework 가 된다.

  • Spring Repogitory (https://repo.spring.io)
    이 저장소는 Spring 을 위해 특별히 호스팅 되는 공개 Maven 저장소이며, 최종 GA(General Available) 릴리즈 외에도 개발 snapshot 및 milestone 을 호스팅한다. jar 파일 이름이 Maven Central 과 같은 형식이기 때문에, Spring 의 개발 버전을 Maven Central 에서 배포된 다른 라이브러리와 함께 얻을 수 있는 유용한 장소이다. 이 저장소는 또한 번들로 묶인 모든 Spring jar 파일들을 포함하는 번들 zip 파일도 제공한다.


다운받는 실제 jar 파일 이름은 spring-core-4.3.6.RELEASE.jar 처럼 일반적으로 버전 번호와 연결된 모듈 이름이다.


가장 먼저 결정해야 할 것은 의존성을 관리하는 방법이다.

모든 Jar를 직접 다운로드하여 수동으로 작업할 수도 있지만, 일반적으로 Maven, Gradle 등의 빌드 자동화 툴을 사용하는 것이 좋다.



Maven 의존성 관리


Maven Central 저장소로부터 Spring 어플리케이션 컨텍스트를 만들기 위해 Maven dependencies 를 다음과 같이 구성할 수 있다.

Spring API에 대해 컴파일 할 필요가 없다면 적용범위(scope) 를 runtime 으로 선언한다.


<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.6.RELEASE</version>
        <scope>runtime</scope>
    </dependency>
</dependencies>
cs


Spring Maven 저장소(예: milestones, 개발자 snapshots) 를 사용하려면 Maven 구성에서 저장소 위치를 지정해야 한다.


For releases:


<repositories>
    <repository>
        <id>io.spring.repo.maven.release</id>
        <url>http://repo.spring.io/release/</url>
        <snapshots><enabled>false</enabled></snapshots>
    </repository>
</repositories>
cs


For milestones:


<repositories>
    <repository>
        <id>io.spring.repo.maven.milestone</id>
        <url>http://repo.spring.io/milestone/</url>
        <snapshots><enabled>false</enabled></snapshots>
    </repository>
</repositories>
cs


For snapshots:


<repositories>
    <repository>
        <id>io.spring.repo.maven.snapshot</id>
        <url>http://repo.spring.io/snapshot/</url>
        <snapshots><enabled>true</enabled></snapshots>
    </repository>
</repositories>
cs



Maven BOM (Bill Of Materials) Dependency


Maven 을 사용하다 보면 다른 버전의 Spring JAR 파일들이 혼합될 수 있지만, BOM dependency 를 사용하면 이를 막을 수 있다.

모든 Spring 의존성을 동일한 버전으로 가져오도록 dependencyManagement 섹션에서 spring-framework-bom 을 import 하면 Spring Framework artifact 작성할 때 더 이상 <version> 속성을 지정할 필요가 없다.


<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-framework-bom</artifactId>
            <version>4.3.6.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
cs



Gradle 의존성 관리


Gradle 로 Spring 저장소를 사용하려면, repositories 섹션에 Maven Central 이나 특정 URL 을 포함시킨다.


repositories {
    mavenCentral()
    // and optionally...
    maven { url "http://repo.spring.io/release" }
}
cs


repositories URL 을 /release 에서 /mileestone 나 /snapshot 으로 변경하거나 더 추가할 수 있다. 

저장소가 설정되었으면, 일반적인 Gradle 방식으로 dependencies 를 선언할 수 있다.


dependencies {
    compile("org.springframework:spring-context:4.3.6.RELEASE")
    testCompile("org.springframework:spring-test:4.3.6.RELEASE")
}
cs




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

Central Repository

Tool/Maven 2013. 5. 9. 22:46

http://repo.maven.apache.org/maven2/
http://search.maven.org

 

 

maven에서 저장소는 세가지로 분류할 수 있습니다.
Central, Internal, Local repository

 

Central repository 는 중앙 저장소라고 하며, 이곳에 등록되어 있는 다양한 버전의 외부 OSS(오픈소스) 라이브러리들을 Maven에서 설정한 <dependency /> 에 지정하여 로컬 저장소에 가져올 수 있습니다. 중앙 저장소에는 개발자가 임의로 라이브러리를 배포할 수 없으니 외부 라이브러리를 가져오는 용도로만 사용한다고 보면 되겠습니다.

 

사용하고자 하는 외부 라이브러리를 중앙 저장소에 접속하여 검색하고 버전을 선택하면, Dependency Information 이 나타나므로 이것을 참조하여 pom 파일을 작성하면 되겠습니다. 의존 라이브러리들은 프로젝트 빌드시에 pom.xml 파일을 참조하여 로컬 저장소에 다운로드 됩니다.

 

 

pom.xml 파일에 의존 라이브러리(dependency) 추가

 

<project ...>

 

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

 

</project>

 

Dependency <scope />는 다양한 빌드 작업에 제한할 수 있습니다.

 

  • compile : default 값이며, 컴파일과 배포시에 필요한 라이브러리.
  • provided : 컴파일에만 필요한 라이브러리.
  • runtime : 어플리케이션을 실행할 때 필요한 라이브러리.
  • test : 테스트에만 필요한 라이브러리.
  • system : provided와 유사하지만 jar을 사용자가 제공해야 함.
  • import : <dependencyManagement /> 에 사용되며 지정된 POM 파일에 정의된 설정으로 교체됨.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,