[Spring] Maven

2023. 9. 14. 23:30학부 강의/웹프로그래밍 (Spring)

아직 배우고 있는 중이라 부정확한 정보가 포함되어 있을 수 있습니다!
주의하세요!

 

올인원 스프링 프레임워크 참고.

 

올인원 스프링 프레임워크 : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

 


1. 컴파일과 빌드의 차이점

 

  • 컴파일 : 코드 파일을 컴파일러가 바이트코드로 변환하는 과정.
  • 빌드 : 컴파일보다 넓은 의미로 라이브러리 다운로드 및 연결, 컴파일, 링크, 패키징 등 애플리케이션 제작에 필요한 전반적인 과정을 뜻합니다.

 


2. 메이븐

 

빌드툴의 종류

  • Ant
    : 과거에 사용. 내부 스크립트가 복잡.
  • Maven
    : 오래전부터 사용되어 여전히 사용됨.
  • Gradle
    : 최근에 많이 사용. Maven에 비해서 대략 2배 빠름.

 

이번 강의에서는 Maven을 사용함.

 

메이븐이 이클립스에 기본적으로 설치되어 있기 때문.

 


가. 메이븐 프로젝트 실성하기

 

Package Explorer 우클릭 → NewProject…Maven Project

 

  • Create a simple project : 이미 존재하는 프로젝트 타입을 선택할 수 있다. 간단한 예제를 만들기 에 편리하다.

 

Group Id, Artifact Id, Version를 입력한다.

  • Group Id
    : 프로젝트 그룹, 구조를 고유하게 식별하는 식별자
  • Artifact Id
    : 개별 프로젝트의 이름.
    : ‘Group Id’ 내에서 여러 아티팩트를 구별하기 위해 ‘Artifact Id’가 필요합니다.
    : Artifact는 소프트웨어 산출물을 뜻하고 자바에서는 JAR 파일을 Artifact라고 부름.
    : Maven에서 생성된 아티팩트(예: JAR 파일)의 이름에도 사용됨. (ex. artifactId가 "my-library"라면 빌드 결과 "my-library-VERSION.jar”가 생성됨.)
  • Version
    : 생성할 프로젝트의 버전

 


나. 메이븐 프로젝트 실행하기

 

move() 메서드 호출하면 이동수단(도보)을 출력하는 프로젝트다.

 

package ch03_pjt_01;

public class MainClass {

    public static void main(String[] args) {
        TransportationWalk transportationWalk = new TransportationWalk();
        transportationWalk.move();
    }

}
package ch03_pjt_01;

public class TransportationWalk {
    public void move() {
        System.out.println("도보로 이동합니다!");
    }
}

 

MainClass에서 TransportationWalk 객체를 new 연산자를 통해서 생성함.

 

MainClassTransportationWalk에 의존한다.

 

new 연산자를 사용하지 않고 스프링 설정 파일을 이용해서 Bean을 생성하고 주입해 보자.

 


3. 첫 스프링 프로젝트

 

앞 선 예제 ch03_pjt_01을 스프링에서 사용하는 의존방법(DI, IoC)으로 변경한다.

 

GenericXmlApplicationContext를 이용해서 main()에서 new 연산자를 사용해서 TransportationWalk를 직접 생성하지 않는다.

 

스프링 설정 파일(applicationContext)을 이용해서 스프링 Ioc 컨테이너에서 Bean으로 생성하여 사용한다는 점이다.

 

GenericXmlApplicationContextorg.springframework.context.support 패키지에 있는 것으로 이를 사용하기 위해서 메이븐(pom.xml)을 이용해서 spring-context-5.2.9.RELEASE.jar를 가져와야 한다.
(java 11과 spring Framework 5.x 이후의 버전이 잘 호환됨.)

 


가. pom.xml 수정

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>spring5</groupId>
  <artifactId>ch03_pjt_01</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <!-- spring-context module-->
  <dependencies>
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>5.2.9.RELEASE</version>
      </dependency>
  </dependencies>

  <!-- bulid config -->
  <build>
      <plugins>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.11.0</version>
              <configuration>
                  <source>11</source>
                  <target>11</target>
                  <encoding>utf-8</encoding>
              </configuration>
          </plugin>
      </plugins>
  </build>

</project>
  • pom.xml : Maven 빌드 설정을 담당한다.

 


나. 프로젝트 업데이트

 

ch03_pjt_02 프로젝트에서 사용되는 JRE 버전이 1.7이다.

 

이를 11 버전으로 업데이트한다.

 

 


다. applicationContext.xml 생성하기

 

applicationContext.xml 생성.

 

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="tWalk" class="ch03_pjt_02.TransportationWalk" />
</beans>
  • <bean id="tWalk" class="ch03_pjt_02.TransportationWalk" /> 외에는 검색해서 붙여 넣어도 된다.
  • <bean id="tWalk" class="ch03_pjt_02.TransportationWalk" />
    : ch03_pjt_02 프로젝트의 TransportatoinWalk 클래스를 tWalk라는 이름으로 등록.

 

  • 24.04.17 추가
<bean id="lazyBean" class="com.company.test" init-method="생성 시 실행할 메서드" destroy-method="소멸 시 실행할 메서드" lazy-init="true"></bean>

lazy-init : 최초로 사용할 때 생성. default는 false.

 

순서에 맞춰서 생성할 필요한 경우 사용할 때 있다.

 


라. MainClass 수정하기

package ch03_pjt_02;

import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {

    public static void main(String[] args) {
//        TransportationWalk transportationWalk = new TransportationWalk();
//        transportationWalk.move();

        GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationContext.xml");

        TransportationWalk transportationWalk = ctx.getBean("tWalk", TransportationWalk.class);
        transportationWalk.move();

        ctx.close();
    }

}
  • 런타임에 스피링 설정 파일(classpath:applicationContext.xml)을 읽어서 GenericXmlApplicationContext ctx 객체를 생성하고 이를 이용해서 필요한 객체(TransportationWalk)를 이용합니다.
  • TransportationWalk transportationWalk = ctx.getBean("tWalk", TransportationWalk.class);
    : TransportationWalk.class 타입의 tWalk라는 이름으로 등록된 빈을 가져온다.
    : TransportationWalk.classTransportationWalk 타입의 객체를 나타내는 것이 아니라, TransportationWalk 클래스 자체를 설명하는 Class<TransportationWalk> 객체를 나타냄. (아래에 보충 설명)

 

org/springframework/context/support/GenericXmlApplicationContext has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0
  • 에러 발생 시
    : jdk-11을 사용하지만 springframework의 버전과 호환이 되지 않아 생기는 문제다.
    : pom.xml에서 org.springframework의 version을 낮춘다. (6.0.115.2.9.RELEASE)
    : 다시 프로젝트 업데이트를 수행한다.

 

  • 24.04.17 추가

Factory 패턴은 객체 생성을 캡슐화하는 디자인 패턴이다.

 

인스턴스를 만드는 코드와 사용하는 코드를 분리하여, 코드의 유연성과 재사용성을 높인다.

 

BeanFactory interface도 이 패턴을 사용하여, 스프링 컨테이너에서 Bean 객체를 생성하고 관리한다.

 

보통 이를 상속하는 ApplicationContext interface의 구현체를 사용한다.

 


마. 클래스 리터럴

 

Java에서 .class는 클래스 리터럴이라고 불리는 것으로, 해당 클래스의 Class 객체를 참조한다.

 

예를 들어, TransportationWalk.classTransportationWalk 타입의 객체를 나타내는 것이 아니라, TransportationWalk클래스 자체’를 설명하는 Class<TransportationWalk> 객체를 나타낸다.

 

또한 Class 객체는 Java의 리플렉션 (Reflection) 기능에서도 사용된다.

 

반영(reflection)은 컴퓨터 과학 용어로, 컴퓨터 프로그램에서 런타임 시점에 사용되는 자신의 구조와 행위를 관리(type introspection)하고 수정할 수 있는 프로세스를 의미한다. “type introspection”은 객체 지향 프로그램언어에서 런타임에 객체의 형(type)을 결정할 수 있는 능력을 의미한다.

 

리플렉션을 사용하면, 런타임에 동적으로 클래스의 메서드, 필드, 생성자 등의 정보를 조회하거나 조작할 수 있다.

 

Spring Framework의 getBean 메서드에서 두 번째 인자로 .class를 전달하는 이유는, 반환되는 빈의 타입을 명시하고, 해당 타입의 객체로 안전하게 캐스팅하기 위함이다.

 

요약하자면, TransportationWalk.classTransportationWalk 타입의 Class 객체를 참조하며, 이는 타입 정보를 제공하거나 리플렉션을 사용하는 데 필요합니다.

 

출처 : ChatGPT4.0

출처 : https://ko.wikipedia.org/wiki/반영_(컴퓨터_과학)