04. 자바 프로젝트 만들기
원래 지금까지 하던대로 자바 프로젝트를 만들어 보자.
평소대로라면,
① 클래스가지고 객체를 먼저 생성하고, ② 해당 객체의 주소값을 참조변수에 넣어주고 , ③그 참조변수를 통해서 뭔가 작업을 하는 식으로 보통 개발을 한다.
package kr.co.softcampus.beans;
public class HelloWorldEn {
public void sayHello() {
System.out.println("Hi~~~");
}
}
package kr.co.softcampus.main;
import kr.co.softcampus.beans.HelloWorldEn;
import kr.co.softcampus.beans.HelloWorldKo;
public class MainClass {
public static void main(String[] args) {
HelloWorldEn hello1 = new HelloWorldEn(); // (1) HelloWorldEn클래스로 객체생성
callMethod(hello1); // (3) 참조변수를 넣은 callMethod메서드를 이용해서 작업하기
HelloWorldEn hello2 = new HelloWorldEn();
callMethod(hello2);
}
public static void callMethod(HelloWorldEn hello) {
// (2) HelloWorldEn클래스의 객체의 주소값을 callMethod메서드의 참조변수로 넣어주기
hello.sayHello();
}
}
그런데, 만약에 내가 만든 HelloWorldEn클래스를 HelloWorldKo클래스로 변경을 하고 싶다면 어떻게 해야 할까?
당연히, 객체를 만들었던 클래스명을 먼저 변경해주고,
package kr.co.softcampus.beans;
public class HelloWorldKo { //클래스명 변경
public void sayHello() {
System.out.println("안녕하세요");
}
}
객체 생성 코드 변경, 메서드에 매개변수로 넣어줄 데이터타입도 변경해야 한다.
package kr.co.softcampus.main;
import kr.co.softcampus.beans.HelloWorldEn;
import kr.co.softcampus.beans.HelloWorldKo;
public class MainClass {
public static void main(String[] args) {
// HelloWorldEn hello1 = new HelloWorldEn();
HelloWorldKo hello1 = new HelloWorldKo();//객체생성부분 변경
callMethod(hello1);
// HelloWorldEn hello2 = new HelloWorldEn();
HelloWorldKo hello2 = new HelloWorldKo();
callMethod(hello2);
}
public static void callMethod(HelloWorldKo hello) { //메서드타입 클래스도 변경
hello.sayHello();
}
}
지금까지는, 이렇게 무언가가 변경되었을때 수동으로 모두 수정을 해줘야 했다.
다루기에 매우 번거롭다는 불편함을 가지고 있고, 유지보수에도 어려움이 있었다.
05. 다형성 사용하기
아직 스프링을 사용하지는 않지만, 자바의 객체지향프로그래밍에서 제공하는 다형성 개념을 이용해서 위의 불편함을 해소해보자.
다형성을 사용하면 아래처럼 좌항은 인터페이스인 HelloWorld 로 두고, 우항만 HelloWorldEn → HelloWorldKo로 변경해주면 된다. 4강의 예제에 비하면 편해졌지만, 다형성 또한 우항을 변경해줘야 한다는 번거로움이 있다.
클래스로 객체를 만드는 방법은 어쩔 수가 없다. 클래스를 정확히 지칭해서 만들어 줘야 하기때문에, 정확한 클래스명을 써서 객체를 만들어야 한다. 수정해야할 객체 생성코드가 100줄이라면, 100줄의 클래스명을 모두 수정해야 한다.
이러한 불편함을 해소하기 위해 나온 것이 스프링 프레임워크이다.
06. 스프링 프레임워크 사용하기
스프링프레임워크를 적용하면 자바 코드작성부분을 줄일수 있다. 하지만 초기 프로젝트 세팅이 다소 복잡하다.
스프링프레임워크사용은 xml을 이용하는 방법과 자바 어노테이션(java4.0~)을 이용하는 방법 2가지로 구분된다.
먼저 고전적인 방식인 xml을 이용하는 방법을 배워보자.
Maven 이란?
스프링프레임워크는 개발도구가 제공되지 않는다. 그냥 자바 어플리케이션을 개발할때 스프링에서 만든 자바 라이브러리를 붙여넣고, 그 라이브러리에서 제공되는 클래스를 이용해서 작업을 하는 방식이다. Maven이나 Gradle을 사용해서 라이브러리를 자동으로 다운받아서 세팅한다. 파이썬의 pip와 같은 것이다.
- 자바 프로젝트의 빌드를 자동으로 해주는 도구
- 개발자가 xml에 작성한 프로젝트 정보를 토대로 컴파일하고 라이브러리를 연결하는 등의 작업을 해주는 도구
- Maven서버를 통해 라이브러리를 다운받아 설정하는 작업도 수행
1) pom.xml파일 작성 - 스프링 버전 명시
이 파일에 Maven 프로젝트에 관련된 정보, 스프링프레임워크의 라이브러리 정보를 작성하면 이 라이브러리가 자동으로 다운로드 된다. 중복해서 계속 사용할 것이기 때문에 한번 만들어두고 복사해서 쓰자.
먼저, spring.io 사이트에서 LEARN에서 최신 버전(맨위 5.3.23)을 찾는다.
(전에는 스프링프레임워크 jar파일을 직접 다운로드 받을수 있었는데, 지금은 스프링프레임워크의 버전 정보만 제공한다.)
Maven Repository사이트(Maven에서 운영하는 라이브러리공식서버)에서 'spring context'검색후 해당 스프링버전을 찾아서 복사한후 pom.xml안의 <dependencies> </dependencies> 안에 붙여넣기.
저장하는 순간 내가 적은 스프링 라이브러리들을 다운로드가 되며, 좌측에 Maven Dependencies탭이 생성된다.
스프링에서 작업할때마다 해당 로그가 출력하게 하는 라이브러리도 추가 (slf4j)
slf4j가 사용할 수 있도록 하는 라이브러리도 추가(logback)
<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>kr.co.softcampus</groupId>
<artifactId>SpringBasic</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- xml에서 사용할 속성들 -->
<properties>
<!-- 자바버전 -->
<java-version>1.8</java-version>
<!-- 스프링 버전 -->
<org.springframework-version>5.3.23</org.springframework-version>
<!-- <org.springframework-version>5.2.22.RELEASE</org.springframework-version> -->
<org.slf4j-version>2.0.3</org.slf4j-version>
<ch.qos.logback-version>1.4.3</ch.qos.logback-version>
</properties>
<!-- 프로젝트에서 사용할 라이브러리 정보 -->
<dependencies>
<!-- spring context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<!-- logback -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${ch.qos.logback-version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
2) beans.xml파일 작성 - 생성할 bean객체 명시
객체를 만들 클래스를 bean에 등록하기. 이때 클래스가 여러개일수 있기 때문에
id속성을 사용하여 이름을 부여해주기. 클래스 명을 바꿀때는 여기 안의 클래스 명만 바꿔주면 된다.
이렇게 한줄만 바꿔주면 된다!!!!! HelloWorldEn → HelloWorldKo 유지보수가 굉장히 간편해졌다!
beans.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='hello' class='kr.co.softcampus.beans.HelloWorldEn'/> -->
<bean id='hello' class='kr.co.softcampus.beans.HelloWorldKo'/> <!--원하는 클래스 명만 써줄것-->
</beans>
3) MainClass.java, HelloWorld.java인터페이스, HelloWorldEn.java, HelloWorldKo.java 파일 작성
package kr.co.softcampus.main;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import kr.co.softcampus.beans.HelloWorld;
public class MainClass {
public static void main(String[] args) {
// beans.xml파일을 로딩한다. 괄호안에 경로를 모두 작성해야 한다.
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("kr/co/softcampus/config/beans.xml");
// xml에 정의한 bean 객체의 주소값을 가져온다.
HelloWorld hello1 = (HelloWorld)ctx.getBean("hello");//형변환 해줘야 함
callMethod(hello1);
HelloWorld hello2 = ctx.getBean("hello", HelloWorld.class);//위와 동일한 코드. 취향에 맞게 사용하자!
callMethod(hello2);
ctx.close();
}
public static void callMethod(HelloWorld hello) {
hello.sayHello();
}
}
출처 : [인프런]윤재성의 스프링 프레임워크 개발자를 위한 실습을 통한 입문 과정
'IT 강의 정리 > 윤재성의 스프링 입문' 카테고리의 다른 글
[섹션4][Annotation] 15강 Java코드를 활용한 Bean등록 (0) | 2022.10.11 |
---|---|
[섹션3][DI] 14강 자동 주입 (0) | 2022.10.11 |
[섹션3][DI] 13강 컬렉션 주입 (0) | 2022.10.10 |
[섹션3][DI] 11~12강 생성자를 통한 주입/ Setter메서드를 통한 주입 (0) | 2022.10.10 |
[섹션2][IoC] 07~10강 IoC컨테이너/ 빈 객체 생성하기/ 빈 객체의 생명주기/ BeanPostProcessor (0) | 2022.10.07 |