[Spring] 001 강의노트

배윤석·2022년 6월 30일
0

Spring

목록 보기
1/6

Spring Framework

Spring Framework

Java 기반으로 만든 프레임워크.
Spring은 Java를 쉽게 개발할 수 있도록 해주는 플랫폼.
JSP의 마지막, 정확히는 JSPMVC Model2의 마지막이다.

왜 배워야 하나?

우리나라 전자정부 프레임워크 때문이다.
전자정부 프레임워크 개발환경
과거, 전자정부 프레임워크의 기반이 되는 원래 프로젝트는 Spring Framework Project 라고 보면 된다.
Spring Frame Work 프로젝트

언어의 발달?

처음 Spring 시작시에는 Java로만 가능했다.
요즘에는? 코틀린이나 그루비 등 여러 언어로 사용이 가능하도록 발전하고 있다.

Spring Framework 강의

Java - JSP - Spring 강좌 Youtube PlayList

핵심 개념

  • DI
    Dependency Injection : 의존성 주입

    객체의 생성, 제거와 관리를 Spring Framework가 처리한다.
    관리에 대한 xml / annotation 설정?

  • AOP
    Aspect Oriented Programming : 관점 중심 프로그래밍

    서블릿에서의 Filter 기능과 동일하다
    Filter : 전처리 / 후처리

만드는 것?

  • Java Application
    이건 잘 안사용한다고 한다.
    쓰는 경우 ? DI 나 AOP 공부할 때나 사용한다.
  • MVC
    실질적으로는 이걸 만들때 사용한다.

프로젝트 구성

  • 구형 구성
    Eclipse + Java Project + 수동 라이브러리 + Spring Bean Configuration
    Eclipse + Maven(Gradle) Project + 라이브러리 설정 + Spring Bean Configuration

    Spring Bean Configuration

    1. Spring 환경설정 파일
    2. xml or annotation 같은 클래스에 대한 관리를 해준다.
  • 최신형 구성
    Eclipse + sts

    STS

    1. Spring Tool Suite

      Suite : 직역하면 '모음곡' 이라고 한다.
      대충 Spring 툴 모음? 이런 뜻인듯?

    2. Spring Framework를 지원하는 IDE 개발 툴 중 하나.
    3. Java 기반의 웹 서비스 어플리케이션 구축을 쉽게 할 수 있도록 도와주는 개발 도구

구형?

일단은 구형 방식으로 만들어보자
Eclipse에 Maven Project를 생성하자.

Maven Project 생성시 주의점

  1. org.apache.maven 으로 필터에 검색
  2. maven-archetype-quickstart 선택하고 next

생성이 완료되었으면, 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	
	<groupId>com.exam</groupId>
	<artifactId>ex01</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>
	
	<name>ex01</name>
	<url>http://maven.apache.org</url>
	
	<properties>
	
		<!-- Generic properties -->
		<java.version>1.8</java.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
	
		<!-- Spring -->
		<spring-framework.version>5.2.8.RELEASE</spring-framework.version>
	
		<!-- Hibernate / JPA -->
		<hibernate.version>4.2.1.Final</hibernate.version>
	
		<!-- Logging -->
		<logback.version>1.0.13</logback.version>
		<slf4j.version>1.7.5</slf4j.version>
	
		<!-- Test -->
		<junit.version>4.11</junit.version>
	</properties>

	<dependencies>
		<!-- Spring and Transactions -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring-framework.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${spring-framework.version}</version>
		</dependency>

		<!-- Logging with SLF4J & LogBack -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${slf4j.version}</version>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>${logback.version}</version>
			<scope>runtime</scope>
		</dependency>

		<!-- Hibernate -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-entitymanager</artifactId>
			<version>${hibernate.version}</version>
		</dependency>

		<!-- Test Artifacts -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${spring-framework.version}</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
			<scope>test</scope>
		</dependency>

	</dependencies>
</project>

그럼 아래 사진과 같이 라이브러리들이 추가된다.

1차적으로, 간단한 코딩을 해보자.

기본적으로 생성되는 App.java 말고 HelloBean1.javaHelloBean2.java를 추가해줬다.

package com.exam.spring01;

public class HelloBean1 {
	public void  sayHello(String name) {
		System.out.println(name + "님 안녕하세요?");
	}
}
package com.exam.spring01;

public class HelloBean2 {
	public void  sayHello(String name) {
		System.out.println("Hello " + name);
	}
}

사용하고 싶으면? App 쪽에서 인스턴스화 시켜줘야한다.

package com.exam.spring01;

public class App 
{
    public static void main( String[] args )
    {
    	HelloBean1 helloBean1 = new HelloBean1();
        helloBean1.sayHello("홍길동");
        
        HelloBean2 helloBean2 = new HelloBean2();
        helloBean2.sayHello("박문수");
    }
}

사용이 완료되면? Bean에다가 연결된 객체를 소멸시켜주는 것이 좋다.
개발자가 객체에 대한 생성과 소멸에 대한 관리를 직접 해줘야 한다.

public class App 
{
    public static void main( String[] args )
    {
    	HelloBean1 helloBean1 = new HelloBean1();
        helloBean1.sayHello("홍길동");
        helloBean1 = null;
        
        HelloBean2 helloBean2 = new HelloBean2();
        helloBean2.sayHello("박문수");
        helloBean2 = null;
    }
}

아무튼, 이렇게 사용하다보니
HelloBean1과 HelloBean2의 메서드가 같다.

이 말인 즉슨? = 다형성을 가지고 있다.

다형성

다형성 : 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미

키보드의 키를 통해서 비유를 들어보겠다.
키보드의 키를 사용하는 방법은 '누른다'이다.
하지만 똑같은 동작 방법의 키라고 하더라도 ESC는 취소를 ENTER는 실행의 목적을 가지고 있다.
다형성이란 동일한 조작방법으로 동작시키지만 동작방법은 다른 것을 의미한다.

생활코딩 Java - 다형성

차라리 이럴바에는 인터페이스를 하나 선언해주고
인터페이스를 써주는 것이 편하겠다, 라는 생각을 가지게 된다.

인터페이스로 구현받는 방법

Hello라는 인터페이스를 하나 생성했다.

package com.exam.spring02;

public interface Hello {
	void sayHello(String name);
}

HelloBean1은 Hello 인터페이스를 구현받았다.
HelloBean2도 마찬가지로 Hello 인터페이스를 구현받았다.

package com.exam.spring02;

public class HelloBean1 implements Hello {

	@Override
	public void sayHello(String name) {
		// TODO Auto-generated method stub
		System.out.println(name + "님 안녕하세요?");
	}
}

최종적으로 실행클래스 App.java를 작성하자.

package com.exam.spring02;

public class App {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Hello hello = new HelloBean1();
		hello.sayHello("홍길동");
		
		hello = new HelloBean2();
		hello.sayHello("홍길동");
	}
}

실행결과

Spring 사용해보기

패키지3 새로 생성

file 하나 생성하고 이름을 context.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-4.3.xsd">
</beans>

Spring에서 객체의 생성과 소멸을 담당하는 내용을 기술할 것이다.

패키지 1번에서 만들었던 HelloBean1HelloBean2 를 가져온다.
그리고 context.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-4.3.xsd">

	<bean name="helloBean1" class="com.exam.spring03.HelloBean1"></bean>
	<bean name="helloBean2" class="com.exam.spring03.HelloBean2"></bean>
	
</beans>

이제 사용해보자

package com.exam.spring03;

import org.springframework.context.support.GenericXmlApplicationContext;

public class App {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		GenericXmlApplicationContext ctx
		= new GenericXmlApplicationContext("classpath:com/exam/spring03/context.xml");
		
		HelloBean1 helloBean1 = (HelloBean1)ctx.getBean("helloBean1");
		helloBean1.sayHello("홍길동");
		
		HelloBean2 helloBean2 = (HelloBean2)ctx.getBean("helloBean2");
		helloBean2.sayHello("홍길동");
		
		ctx.close();
	}

}

실행 결과는 다음과 같다.

그런데 코드를 다시 살펴보면 new가 없다.
어디선가 가져온 설정값으로 HelloBean1을 실행시킨다?

앞에서 했을떄는 생성자로 new를 적었다.
그런데 이 코드는 new를 안했는데도? 실행된다.
그럼 이부분은 뭐다? Spring에서 new라는 부분을 가져온것이다.

이부분은 JDBC에서 context.xml로 가져온것과 비슷하다.
생성자가 생성되었는지 확인해 볼까?

다시 HelloBean1.java로 돌아가자.
생성자를 추가하자.

package com.exam.spring03;

public class HelloBean1 {
	
	public HelloBean1() {
		// TODO Auto-generated constructor stub
		System.out.println("HelloBean1 생성자 호출");
	}
	
	public void  sayHello(String name) {
		System.out.println(name + "님 안녕하세요?");
	}
}

HelloBean2.java 도 비슷한 방식으로 생성자를 추가해 주었다.

App.java 는 생성자를 실행시키라는 구문( new )이 없다.
우선 프로그램을 다시 실행시켜보자.

new 가 없는데도 생성자가 호출된다.

알게된 점

Spring이 사용하려고 생성자를 호출한다.

profile
차근차근 한 걸음씩 걸어나가는 개발자 꿈나무.

0개의 댓글