스프링 프레임워크
JAVA ENTERPRISE APPLICATION 개발에 사용되는 자바플랫폼을 위한 오픈소스 어플리케이션 프레임워크이다
오픈소스라 다 공개가 되어있기 때문에 이걸로 돈벌이하면 돈 토해내야한다 !! 조심 !!!
자바개발을 좀 더 쉽게 도와주기위해서 쓰는게 스프링이다.
작은 사이트에는 의미없고 대형병원 대학교에서 스프링을 사용하게 된다.
특징
- 자바 객체를 담고 있는 경량 컨테이너이다
객체의 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로 부터 필요한 객체를 얻어올 수 있다
스프링을 하게 되면 new Test( ) 이런게 사라짐. 모든 객체의 생성과 소멸을 스프링이 알아서해주게되는 것 !!
- POJO(Plain Old Java Object) 기반의 개발
특별하게 누구에게 상속받는게 아닌 Object에게 상속을 받는 것이다.
클래스 Test(Object를 확장) -- POJO 형식
- 제어 반전(IoC - Inversion of Control)을 지원
컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자 코드를
호출할 수 있다
모든 제어권을 스프링이 가지고 있는 것 !
- 의존성 주입 DI (Dependency Injection)을 지원
설정파일을 통해서 객체간의 의존 관계를 설정할 수 있다
- AOP(Aspect Oriented Programming) 지원
중복제거하기위해서 나옴 !! 똑같은 코드를 여러번 쓰는 것을 싫어하므로 !
결합도를 낮춘다. 중복되는 모든 코드들도 해결하겠다 ! 관점지향
- 트랜잭션 처리를 위한 방법을 제공
- 영속성과 관련되 다양한 서비스를 제공
myBatis, hibernate등 데이터베이스 처리 라이브러리와 연결할 수 있는 인터페이스를 제공한다.
- 동적인 웹 사이트 개발하기 위한 여러가지 서비스를 제공
우리나라에서는 공공기관의 웹 서비스 개발 시 사용을 권장하는 전자정부 표준프레임워크의 기반
기술로 사용되고 있다
- MVC Framework를 제공
- 인터페이스 베이스 설계와 스프링을 활용함으로써 소스 파일은 변경하지 않고 스프링 설정 파일만 변경해서
다양한 객체 를 생성하는, 변경이 유연한 어플리케이션을 작성할 수 있게 되었다
- 스프링을 사용하는 이유는 "필요한 인스턴스를 스프링에서 미리 생성해 준다" 라는 장점을 얻을 수 있다.
모든 new를 스프링이 한다 !!
- 스프링은 자주 변경이 되거나 컴포넌트의 재활용이 높은 유연한 어플리케이션을 작성할 수 있게 하며 테스트도 쉽다.
- 스프링은 프레임워크지만 스트럿츠처럼 웹 어플리케이션 전용의 프레임워크와는 다른 특징이 있다
- 스프링은 '어플리케이션 프레임워크'로 불린다
콘솔 어플리케이션나 스윙과 같은 GUI 어플리케이션등 어떤 어플리케이션에도 적용 가능한 프레임워크이다.
- 스프링은 EJB와 같이 복잡한 순서를 거치지 않아도 간단하게 이용할 수 있기 때문에 "경량 컨테이너" 라고 부른다.
- 스프링은 Dependency Injection(DI)와 Aspect Oriented Programming(AOP)을 가장 중점적인 기술로 사용하지만
여러가지 기능도 제공하고 있다. (주요특징은 DI / AOP)
스프링을 왜 써요?? 자바개발을 쉽게하기위해서 !!
AOP - 중복제거를 위해서! 중복제거 왜 필요하느냐!!
OOP(객체지향)에서 모든 코드를 메서드 단위로 나눈다. 얘는 오로지 로그인만 얘는 회원가입만 이걸 다 나눔
왜? 중복을 안시키기위해서 메서드 단위로 나눔
근데 문제가 생김
이런식으로 메서드 단위로 잘랐는데 코드가 중복된다.
AOP는 이런걸 제거하겠다 !!
스프링의 중요한 특징을 대라 !! 하면 DI와 AOP를 얘기하면 된다 !
1. 스프링 설치
기존에는 공식사이트에서 zip 압축파일을 받아 jar를 구했는데 지금 사이트에서 Maven, Gradle로 라이브러리를 받게 끔 하고 있다
2. 스프링 편집기 - STS
http://dist.springsource.com/release/STS/index.html
--- X
https://github.com/spring-projects/toolsuite-distribution/wiki/Spring-Tool-Suite-3
추가로 더 받기 !! 위에 2개는 밑에 받은 과정이 먼저 있음 ! 순서가 밑에가 먼저였음~
http://commons.apache.org/logging/download_logging.cgi
압축은 Spring 폴더에 풀기 !!
스프링 프레임워크
- JDK 11 (java.oracle.com)
디: 스프링(Spring Framework) lib 작업공간
spring.io (스프링 전용 사이트)
JDK를 작성하기위해서 편집기가 필요하다.
편집기: 메모장, Eclipse, IntelliJS
우리는 이클립스쪽으로 들어간다.
스프링 관련된 jar파일이 필요한데 스프링 전용사이트에서는 jar파일을 제공하지 않기 때문에
Maven이랑 Gradle을 제공한다.
STS(Spring Tool Suits) - 스프링 전용 이클립스를 이용한다.
이클립스랑 똑같이 생겼다 !!
STS3을 써야하다. ( Spring Legacy Project - STS4에는 없다.)
우리는 3버전으로 가야한다. 3버전 다운받아야한다.
스프링관련된거는 Maven이나 Gradle을 이용해서 Spring을 설정한다.
STS3 다운받으러 가자 !!
https://github.com/spring-attic/toolsuite-distribution/wiki/Spring-Tool-Suite-3
압축은 반드시 Spring에 풀기 !!
Spring Framework 은 JDK 11, Tomcat 9.0, Spring 5.x 사용해야 잘 처리가 된다.
Spring 6.x 에서는 Tomcat 9.0 과 연결이 제대로 되지 않는다.
=> 슈퍼클래스 "jakarta.servlet.http.HttpServlet"을 Java 빌드 경로에서 찾을 수 없습니다.
에러 발생한다.
그래서 STS.ini 파일에서 JDK 11로 설정하고, 프로젝트를 생성한 뒤 JDK 버전을 바꾸어서 사용하면 된다.
=> Spring Legacy Project가 아직 JAVA 17을 지원하지 않아서 발생하는 에러이다.
(부팅하는동안만 11로 유지해주면 된다.)
원래 javax였는데 회사가 넘어가서 jakarta로 바뀜.
[ 코드 추가하기 ]
STS.this
-제품
org.springsource.sts.ide
--런처.기본 동작
오픈파일
-VM
C:\프로그램 파일\Java\jdk-11\bin\javaw.exe
-vmargs
-Dosgi.requiredJavaVersion=11
-Dosgi.dataAreaRequiresExplicitInit=true
-Xms256m
-Xmx2048m
--add-modules=모든 시스템
-Dosgi.모듈.잠금.시간 초과=10
-javaagent:D:\Spring\sts-bundle\sts-3.9.18.RELEASE\lombok.jar
저장버튼 누르기 !!
스프링은 무조건 jsp 즉 web코드를 제공한다.
스프링부트로 가면 jsp를 없애버렸다. 무거우므로
jsp를 쓰지말자 해서 없애버림 ---> Thyme Leaf가 나옴 / 아니면 React or Vue를 쓰자가 됨.
전부 UTF-8로 바꾸자 !!
Web은 전부 맨 위에 있는 UTF-8로 바꾸기 !
적용하고 닫기 하세요!
[실습]
프로젝트 : Chapter01_XML
Chapter01_YEAR
객체생성하는 방법에는 3가지
스프링에서는 객체라고 안 하고 빈을 생성하세요~ 이런다.
자바에서 객체를 생성하세요 = new 클래스명( ) -- 물귀신으로 생성자가 따라붙는다.
이제는 new 안 한다.
스프링에서는 모든 것들을 내가 알아서 할테니 new하지마라 new를 뺌
xml 안에서 생성해주는데 빈을 생성한다고 한다.
빈 생성하는 방법이 3가지
1. XML 안에 생성한다.
2. 어노테이션 안에 생성한다.
3. *.java 파일 안에 생성한다.
이 방법은 부트에서도 쓰는데 부트가 훨씬 더 간단하게 쓴다.
# 프로젝트 생성하는 방법
1. 스프링 레거시 프로젝트
① New → Spring Legacy Project → 프로젝트명 → Simple Java → Next
→ JDK 버전 → Finish → Don't Create 클릭
② Maven 변환
프로젝트 → 우클릭 → Configure → Convert to Maven Project → Finish
2.메이븐 프로젝트
① New → Maven Project 생성 → Next → Finish
② 프로젝트 → 우클릭 → Maven → Update Project
③ 프로젝트 → 우클릭 → Properties → Project Facets → JDK 버전 변경
프로젝트 → 우클릭 → Properties → Java Build Path → JDK 버전 변경
-----> 이건 위에서 했던 과정(17버전으로 바꾸기)
projectMVC의 lib 폴더 안에 jar 파일을 다 집어넣어야한다.
projectMVC가 아니라 다른 프로젝트를 만들게되면
miniProject 안에서도 jar파일을 가지고 있어야한다.
(학교갈 때 책가방 안에 책을 들고다니듯이)
용량을 많이 차지하게 된다.
그래서 이제부터는 사물함을 만들자는 것
여기서는 Maven이 제공을 한다. Maven측에서 jar파일을 전부 다 가지고 있다.
우리가 필요하다면 내려받아서 써라 얘기하는 것
projectMVC와 miniProject는 jar파일을 가지고 다닐 필요가 없다.
처음에는 인터넷이 되어야 내려받는다.
영수 컴퓨터
projectMVC를 만든다.
Maven으로부터 jar파일을 내려받고 싶다. (책가방 안에 책을 들고다닐 필요가 없다. 내려받으면되므로)
근데 jar파일을 어디에 보관하냐!? repository 안에 보관하면 된다.
재헌 컴퓨터도
한 번만 다운받으면 repository 안에 보관하고 있다.
한 번만 다운받으면 얘가 보관하고 있으므로 처음 다운받을 때만 인터넷이 되면되고
나중에 다운받을 필요가 없고 그냥 주세요 요청하면 갖다가 쓸 수 있는 것 !!
Chapter01_XML에 가면 jar 파일 요청을 pom.xml에다가 하는 것
회사견적서 같은거 뭐가뭐가 필요하면 견적서를 떼야하듯이 xml에 요구하는 것
release 버전을 17로 바꾼다.
저장하기 !!
C:\Users\bitcamp\.m2\repository
필요없으면 sts를 다운하고 m2를 지우고 다시 켜면 알아서 다시 다운받아진다(대신 인터넷이 되어야 함)
context 하나로 줄줄이 다운받아지는 것 jar파일도 다운받아진다.
원래는 jar파일을 손으로 직접 다운받았다.
스프링이나 스프링부트는 머리 하나만 끄집어내면 걔와 연관된 애들은 줄줄이 따라오는 것이다.
이게 maven이랑 gradle을 썼을 때 좋은 점이다 !
Chapter01_ANNO
pom.xml
※ pom.xml에 추가해야 할 <build></build> 부분은 미리 복사해둔다.
Project : Chapter01_XML
Package : sample01
Interface : MessageBean
Class : HelloSpring - public static void main(String[] args)
MessageBeanKo - 인터페이스 MessageBean을 오버라이드한 클래스
MessageBeanEn - 인터페이스 MessageBean을 오버라이드한 클래스
MessageBean.java
package sample01;
public interface MessageBean {
public void sayHello(String name); //추상 메소드
}
MessageBeanKo.java
package sample01;
public class MessageBeanKo implements MessageBean {
@Override
public void sayHello(String name) {
System.out.println("안녕하세요 " + name);
}
}
MessageBeanEn.java
package sample01;
public class MessageBeanEn implements MessageBean {
@Override
public void sayHello(String name) {
System.out.println("Hello " + name);
}
}
HelloSpring.java -- 모든 프로젝트의 시작점이 된다.
sayHello 메서드를 호출하고싶은 것
객체지향으로 생각해야한다. - new해서 생성한다.
MessageBeanKo messageBeanKo = new MessageBeanKo(); //1대1, 결합도 100%
클래스가 작을 때는 괜찮다.
하지만, 클래스가 많으면 위에처럼 잡지말자.
MessageBean messageBean = new MessageBeanKo(); //부모 = 자식, 다형성, 결합도 낮추기
밑에는 MessageBeanKo messageBean = new MessageBeanKo(); 이런식으로 실수로 적음 확인하기 !!
package sample01;
public class HelloSpring {
public static void main(String[] args) {
//MessageBeanKo messageBeanKo = new MessageBeanKo(); //1대1, 결합도 100%
MessageBean messageBean = new MessageBeanKo(); //부모 = 자식, 다형성, 결합도 낮추기
messageBean.sayHello("Spring");
}
}
MessageBeanKo.java -- 생성자 만들기
생성자는 void 이런 return형이 없다.
package sample01;
public class MessageBeanKo implements MessageBean {
public MessageBeanKo() {
System.out.println("MessageBeanKo 기본 생성자");
}
@Override
public void sayHello(String name) {
System.out.println("안녕하세요 " + name);
}
}
MessageBean messageBean = new MessageBeanEn();
package sample01;
public class HelloSpring {
public static void main(String[] args) {
//MessageBeanKo messageBeanKo = new MessageBeanKo(); //1대1, 결합도 100%
MessageBean messageBean = new MessageBeanEn(); //부모 = 자식, 다형성, 결합도 낮추기
messageBean.sayHello("Spring");
}
}
*********** 지금까지 한게 자바이다 !! ***********
- 스프링을 사용하는 이유는 "필요한 인스턴스를 스프링에서 미리 생성해 준다" 라는 장점을 얻을 수 있다.
변환되는 클래스 생성을 스프링이 해주겠다.
Scanner scan = new Scanner(System.in) -- 이런건 그냥 new해주면된다.
src/main/resources : applicationContext.xml
그냥 src에 넣어주면 된다.
스프링에서 빈을 만들어주는 환경설정 파일이다.
깜박하고 context 선택을 안 했으면 ???
여기서 추가하면 된다 ~
applicationContext.xml
이제 new하지말고 스프링 설정파일을 이용하자 !!!
이제는 객체가 아니라 빈을 생성하세요 !!
xml에서는 풀 쿼리네임으로 적어야한다. 패키지 이름까지 적어야한다.
<bean id="messageBean" class="sample01.MessageBeanEn"></bean>
위에서 new로 생성한 것과 같은 것임을 확인 !!
MessageBeanEn.java -- 기본 생성자 만들기
package sample01;
public class MessageBeanEn implements MessageBean {
public MessageBeanEn() {
System.out.println("MessageBeanEn 기본 생성자");
}
@Override
public void sayHello(String name) {
System.out.println("Hello " + name);
}
}
HelloSpring.java
환경설정 파일이 있는 것을 모르므로 알려줘야 한다 !!
ApplicationContext context = new FileSystemXmlApplicationContext("src/applicationContext.xml");
MessageBean messageBean = (MessageBean) context.getBean("messageBean");
//applicationContext.xml에서 Bean의 id 값을 넣어주면 얻어온다는 것
package sample01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class HelloSpring {
public static void main(String[] args) {
//MessageBeanKo messageBeanKo = new MessageBeanKo(); //1대1, 결합도 100%
//MessageBean messageBean = new MessageBeanEn(); //부모 = 자식, 다형성, 결합도 낮추기
//스프링 설정 파일 이용
ApplicationContext context = new FileSystemXmlApplicationContext("src/applicationContext.xml");
MessageBean messageBean = (MessageBean) context.getBean("messageBean"); //applicationContext.xml에서 Bean의 id 값을 넣어주면 얻어온다는 것
messageBean.sayHello("Spring");
}
}
applicationContext.xml -- class="sample01.MessageBeanKo"
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<bean id="messageBean" class="sample01.MessageBeanKo"></bean>
</beans>
MessageBeanKo.java
package sample01;
public class MessageBeanKo implements MessageBean {
private int num; //필드, 초기화되어있으므로 0으로 잡힌다.
public MessageBeanKo() {
System.out.println("MessageBeanKo 기본 생성자");
}
@Override
public void sayHello(String name) {
num++;
System.out.println("num = " + num);
System.out.println("안녕하세요 " + name);
}
}
num은 초기값을 0으로 잡고있으므로 num++을 통해서 num = 1이 나오는 것 !!
HelloSpring.java
package sample01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class HelloSpring {
public static void main(String[] args) {
//MessageBeanKo messageBeanKo = new MessageBeanKo(); //1대1, 결합도 100%
//MessageBean messageBean = new MessageBeanEn(); //부모 = 자식, 다형성, 결합도 낮추기
//스프링 설정 파일 이용
ApplicationContext context = new FileSystemXmlApplicationContext("src/applicationContext.xml");
MessageBean messageBean = (MessageBean) context.getBean("messageBean"); //applicationContext.xml에서 Bean의 id 값을 넣어주면 얻어온다는 것
messageBean.sayHello("Spring");
System.out.println();
MessageBean messageBean2 = (MessageBean) context.getBean("messageBean"); //applicationContext.xml에서 Bean의 id 값을 넣어주면 얻어온다는 것
messageBean2.sayHello("Spring");
System.out.println();
MessageBean messageBean3 = (MessageBean) context.getBean("messageBean"); //applicationContext.xml에서 Bean의 id 값을 넣어주면 얻어온다는 것
messageBean3.sayHello("Spring");
System.out.println();
}
}
위에서 적은 코드는 밑의 코드처럼
MessageBean messageBean = new MessageBeanKo();
messageBean .sayHello(Spring); // num = 1
MessageBean messageBean2 = new MessageBeanKo();
messageBean2 .sayHello(Spring); // num = 1
MessageBean messageBean3 = new MessageBeanKo();
messageBean3 .sayHello(Spring); // num = 1
이렇게 객체를 3개 만든 효과랑 똑같은 것 ! -- 하지만 우리가 생각한 것과 다른결과가 나옴을 확인할 수 있다.
자바코드로 하면 num의 값이 어떻게 나올까??
num = 1 다 1로 나와야한다.
messageBean → MessageBeanKo
num 0 → 증가하게 되면 1
messageBean2 → MessageBeanKo 또 만들게 되는 것
num 0 → 증가하게 되면 1
또 다시 1로 잡히는 것
또 new 시켜도 또 MessageBeanKo 클래스가 만들어지면서 num이 0으로 세팅되고 num++하니 1이 나옴.
근데 스프링에서는 위에처럼 num=1 / num=2 / num=3 이렇게 나온다는 것은
싱글톤으로 하나만 만든다는 것이다 !!
각각의 클래스를 만드는게 아닌 하나를 두고 같이 쓰는 싱글톤으로 만든다는 것 !!
messageBean → MessageBeanKo
num 0 → 증가하게 되면 1
messageBean2 ↑ num1 → 증가하게 되면 2
messageBean3 ↑ num2 → 증가하게 되면 3
나는 싱글톤이 아닙니다 prototype으로 해주세요 설정하면 된다.
applicationContext.xml -- 따로 만들어주세요.
<bean id="messageBean" class="sample01.MessageBeanKo" scope="prototype"></bean>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<bean id="messageBean" class="sample01.MessageBeanKo" scope="prototype"></bean>
</beans>
이렇게 각각으로 잡히는 것을 확인할 수 있다.
sample01 복사해서 붙여넣기
applicationContext.xml
<context:component-scan base-package="sample01" />
-- 어노테이션이 패키지 sample01에서 일어나고 있는 거 말해주는 것이다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="sample01" />
</beans>
MessageBeanKo.java -- @Component("messageBean") / @Scope("prototype")
-- 원래 applicationContext.xml에 써줬던 코드를 이제 자바파일에 어노테이션으로 적는 것이다 !!
package sample01;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component("messageBean")
@Scope("prototype")
public class MessageBeanKo implements MessageBean {
private int num; //필드, 초기화되어있으므로 0으로 잡힌다.
public MessageBeanKo() {
System.out.println("MessageBeanKo 기본 생성자");
}
@Override
public void sayHello(String name) {
num++;
System.out.println("num = " + num);
System.out.println("안녕하세요 " + name);
}
}
왼쪽 오른쪽이 같은 역할을 하는 코드인 것을 확인할 수 있다.
어노테이션을 이용했냐 / xml 파일을 이용했냐의 차이 !!
'Spring' 카테고리의 다른 글
DAY 63 - 스프링 프레임워크 - AOP (2024.10.04) (0) | 2024.10.04 |
---|---|
DAY 62 - 스프링 프레임워크 - 파일출력 (2024.10.02) (1) | 2024.10.02 |
DAY 61 - 스프링 프레임워크 HOMEWORK (2024.10.01) (2024.10.02) (0) | 2024.10.02 |
DAY 61 - 스프링 프레임워크 (2024.10.01) (1) | 2024.10.01 |
DAY 60 - 스프링 프레임 워크 HOMEWORK (2024.09.30) (2) | 2024.09.30 |