2023. 9. 14. 23:30ㆍ학부 강의/웹프로그래밍 (Spring)
아직 배우고 있는 중이라 부정확한 정보가 포함되어 있을 수 있습니다!
주의하세요!
올인원 스프링 프레임워크 참고.
1. 컴파일과 빌드의 차이점
- 컴파일 : 코드 파일을 컴파일러가 바이트코드로 변환하는 과정.
- 빌드 : 컴파일보다 넓은 의미로 라이브러리 다운로드 및 연결, 컴파일, 링크, 패키징 등 애플리케이션 제작에 필요한 전반적인 과정을 뜻합니다.
2. 메이븐
빌드툴의 종류
- Ant
: 과거에 사용. 내부 스크립트가 복잡. - Maven
: 오래전부터 사용되어 여전히 사용됨. - Gradle
: 최근에 많이 사용. Maven에 비해서 대략 2배 빠름.
이번 강의에서는 Maven을 사용함.
메이븐이 이클립스에 기본적으로 설치되어 있기 때문.
가. 메이븐 프로젝트 실성하기
Package Explorer 우클릭 → New
→ Project…
→ 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
연산자를 통해서 생성함.
MainClass
는 TransportationWalk
에 의존한다.
new
연산자를 사용하지 않고 스프링 설정 파일을 이용해서 Bean을 생성하고 주입해 보자.
3. 첫 스프링 프로젝트
앞 선 예제 ch03_pjt_01
을 스프링에서 사용하는 의존방법(DI, IoC)으로 변경한다.
GenericXmlApplicationContext
를 이용해서 main()
에서 new
연산자를 사용해서 TransportationWalk
를 직접 생성하지 않는다.
스프링 설정 파일(applicationContext)을 이용해서 스프링 Ioc 컨테이너에서 Bean으로 생성하여 사용한다는 점이다.
GenericXmlApplicationContext
는 org.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.class
는TransportationWalk
타입의 객체를 나타내는 것이 아니라,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.11
→5.2.9.RELEASE
)
: 다시 프로젝트 업데이트를 수행한다.
- 24.04.17 추가
Factory 패턴은 객체 생성을 캡슐화하는 디자인 패턴이다.
인스턴스를 만드는 코드와 사용하는 코드를 분리하여, 코드의 유연성과 재사용성을 높인다.
BeanFactory
interface도 이 패턴을 사용하여, 스프링 컨테이너에서 Bean 객체를 생성하고 관리한다.
보통 이를 상속하는 ApplicationContext
interface의 구현체를 사용한다.
마. 클래스 리터럴
Java에서 .class
는 클래스 리터럴이라고 불리는 것으로, 해당 클래스의 Class
객체를 참조한다.
예를 들어, TransportationWalk.class
는 TransportationWalk
타입의 객체를 나타내는 것이 아니라, TransportationWalk
’클래스 자체’를 설명하는 Class<TransportationWalk>
객체를 나타낸다.
또한 Class
객체는 Java의 리플렉션 (Reflection) 기능에서도 사용된다.
반영(reflection)은 컴퓨터 과학 용어로, 컴퓨터 프로그램에서 런타임 시점에 사용되는 자신의 구조와 행위를 관리(type introspection)하고 수정할 수 있는 프로세스를 의미한다. “type introspection”은 객체 지향 프로그램언어에서 런타임에 객체의 형(type)을 결정할 수 있는 능력을 의미한다.
리플렉션을 사용하면, 런타임에 동적으로 클래스의 메서드, 필드, 생성자 등의 정보를 조회하거나 조작할 수 있다.
Spring Framework의 getBean
메서드에서 두 번째 인자로 .class
를 전달하는 이유는, 반환되는 빈의 타입을 명시하고, 해당 타입의 객체로 안전하게 캐스팅하기 위함이다.
요약하자면, TransportationWalk.class
는 TransportationWalk
타입의 Class
객체를 참조하며, 이는 타입 정보를 제공하거나 리플렉션을 사용하는 데 필요합니다.
출처 : ChatGPT4.0
출처 : https://ko.wikipedia.org/wiki/반영_(컴퓨터_과학)
'학부 강의 > 웹프로그래밍 (Spring)' 카테고리의 다른 글
[Spring] 학사 정보 시스템 (0) | 2023.10.07 |
---|---|
[Spring] 스프링으로 계산기 만들기 (0) | 2023.09.22 |
[Spring] DI, DIP, IoC (0) | 2023.09.09 |
[Spring] 개발 환경 구축 (0) | 2023.09.07 |
[Spring] model1, model2, MVC 패턴 (0) | 2023.09.07 |