Spring vs SpringBoot [day 87]

stan·2023년 9월 18일
0

Spring

목록 보기
21/22

스프링 vs 스프링부트

xml설정대신 @위주로 설정하기때문에
부트가 더 편리함
요즘 스타트업은 부트를 쓸 확률이 높음

스프링

Ioc와 AOP를 지원하는 경량(POJO 기반)의 프레임워크
	IoC
	낮은 결합도
	AOP
	높은 응집도

객체를 생성 및 관리해주는 컨테이너로서의 기능도 제공함
		-> 객체들 사이의 의존성(dependency)을 주입
		

부트만의 특성

웹 서버(톰캣같은게)가 기본적으로 내장되어있음 
스타터 프로젝트를 사용하게 됨 
-> 라이브러리 관리를 대신 해줌 (버전관리등: 최적화된 버전으로 알아서)
-> 기존 스프링에서 pom.xml로 라이브러리를 관리 해줬음
		직접 버전 관리 해줘야 함
xml 설정대신 @위주로 설정
maven 대신 -> gradle 자동화 도구 이름

설치

https://spring.io/tools
Spring Tools 4 for Eclipse

STS4 설치파일은 .jar

명령프롬프트로 압축해제
java -jar 주소

C:\Users\Administrator>java -jar D:\KIM\resource\spring-tool-suite-4-4.19.1.RELEASE-e4.28.0-win32.win32.x86_64.self-extracting.jar
C:\Users\Administrator\sts-4.19.1.RELEASE

인코딩 설정 바꾸기

플젝생성
스프링부트 -> 스타터 프로젝트

Type: 메이븐이아니라 gradle-groovy
Java Version: 11
Packaging: War (jar는 컴파일러가 War는 서버)
Group(관리회사부서팀이름): com.kim
Next -> Dependencies
Spring Web 추가

중요한거두개

static : 정적 resource를 넣는곳
html
css
js
파일
(동적resource는 jsp인데 이건 src 폴더에 넣음)

application.properties :
뭔가 작성 할 수 있게 되어 있음
스프링에서의 .xml같은 프로젝트 전반에대한 설정파일

server.port = 8088

gradle에 대한 설정파일이 build.gradle에 들어가있음 (pom.xml보다 짧음)

에러 종류 :

  • localhost에서 연결을 거부했습니다. ERR_CONNECTION_REFUSED == 그냥 서버가 꺼진거임

  • 404 = mapping된 페이지 없음이란 뜻

  • 500 = java 로직 에러


Q. 404 에러 발생! 어디서 부터 에러를 추적 해 나갈 것인가
? jsp페이지에 form 액션명들을 확인 하고 .java페이지에 매핑 되어있는 액션 명들 확인 ?
A.
1. 웹 브라우저의 URL을 확인 합니다
http://localhost:8088/
슬래시뒤에 없는 root(최초)요청을 한 상태

  1. @RequestMapping
    /에 대한 @이 존재하는지 확인

  2. return VIEWNAME이 올바른지 확인

Q. 500 에러 발생!

> 
JAVA 에러
NPE	vs	!NPE >> 1. chatGPT 2.구글링 3.선임 ▶ 에러 및 해결
주체(주어)가 NULL인 경우
xxx.메서드();의 xxx가 NULL인 경우
aaa.메서드(bbb);의 aa가 NULL인 경우
	절대 bbb XXXXXX

▶▶ 의존 주입 ◀◀ chatGPT가 가장 설명 못하는 부분

DI
Q. 의존성이란?
class A {
private B b;
private C c;
}

a 객체는 b,c를 사용합니다. 
a 객체는 b,c객체의 기능에 "의존"하게 된다. 
--->> C는 Service레이어에 의존하고,
	Service레이어는 DAO의 기능을 사용합니다

Q. 의존 주입의 방법을 설명해봐라!
setter 주입과
주로 b,c객체가 외부에 생성이 되어있어서,
a 객체로 주입을 해오고싶을때 활용

생성자 주입이 있습니다! ^^ (강제하고싶을때주로사용)
	주로 a를 생성할때에 b,c 객체가 반드시 필요해서,
	b,c 객체를 a생성자 메서드 내부에서 생성할때 활용

setter 주입이 뭔뎅?? 생성자 주입은 뭔데??

★누가 의존주입을 할까?
스프링 이전에는 개발자가 직접 객체를 생성했는데,
컨테이너가 객체 생성 및 관리(의존주입)을 해줌
제어권이 컨테이너로 넘어감 == 제어의 역행 == Inversion of Control == IoC

Q. IoC하면 뭐가 좋아요?
개발자가 직접 new XXXXX
결합이 약해짐!
▶OOP(객체 지향 프로그래밍)에서 결합을 약하게 하면 개발자가 직접 관리할것들이 적어짐

유지보수가 용이해짐 

설계 패턴???
1) 팩토리 패턴
객체명으로 객체를 반환받을수있도록 해주는 패턴
이미 메모리에 생성되어있던(적재,로딩)객체를 반환받음
결합도를 낮춤
2) MVC
각 파트별로 코드를 분할 관리 -> 응집도 높아짐
결합도를 낮춤 -> 유지보수 용이
3) 템플릿 패턴
JDCB와 같은 반복적인 로직에 주로 활용됨
가독성을 높여줌
4) 싱글톤 패턴
메모리에 같은 타입의 객체를 하나씩만 생성될수있도록 관리

Phone


package test;

public interface Phone {
	void call(String name);
	// 인터페이스에 작성하는 메서드 기본적으로 달리는 설정들:
	// public : 메서드 제정의 하는걸 강제함; 누군가의 부모가 되야 하는데 부모의 공개범위가 자식보다 무조건적으로 더 넓어야 함
	// abstract : 무조건 추상이 되기 때문에 메서드를 가질수가 없음 
	
}
------------------------------------------------
package test;

public class PhoneA implements Phone{

	@Override
	public void call(String name) {
		System.out.println("PhoneA : "+ name+"이(가) 정화거는중...");
	}

}
------------------------------------------------
package test;

public class PhoneB implements Phone{

	@Override
	public void call(String name) {
		System.out.println("PhoneB : "+ name+"이(가) 정화거는중...");
	}

}

Teemo

package test;

public class Teemo {
	private String name;
	private Phone phone;
	public Teemo() {
		System.out.println("Teemo 기본 생성자 호출됨");
	}
	//생성자 오버로딩
	public Teemo(String name, Phone phone) {
		this.name=name;
		this.phone=phone; //this==자기자신객체
		System.out.println("Teemo 생성자 호출됨");
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Phone getPhone() {
		return phone;
	}
	public void setPhone(Phone phone) {
		this.phone = phone;
	}
	
	@Override
	public String toString() {
		return "Teemo [name=" + name + ", phone=" + phone + "]";
	}
	public void print() { //지역변수가 없기 떄문에 this.가 달려있는 것 처럼 작동
						// this 키워드는 생략가능!
		phone.call(name);
	}
}

Test01


package test;

class A {
	//private == error line 14
	public A() { //생성자는 클래스와 이름이 같고 아웃풋이 없어야하고 인자가 없으면 기본 생성자 
		System.out.println("기본 생성자 호출됨");
		
	}
}

public class Test01 {
	
	public static void useA() {
		A apple = new A(); //결합도가 높으면 외부 코드 변화에 반응을 합니다 
		//개발자가 직접 new
		//결합이 약함 
		
	}
	
	public static void useA(A a) { //오버로딩 : 메서드 시그니처가 달라서 가능!
		A apple = a;
		//외부에서 객체를 받아옴 == 객체를 주입받는다!!!
		//결합이 약함 
	
	}
	
	public static void main(String[] args) {
		
		//결론)
		//코드의 결합도가 높을수록
		//안정성이 떨어짐
		//유연성이 떨어짐
		//외부 코드 변화에 에러가 발생할 확률이 높아짐 == 유지보수가불리
		
	}
}

new 가 적을 수록 결합도가 낮아짐


Config

package test;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//설정 클래스
// Configuration : 프로그램의 설정을 저장해두고 환경을 구성하는 데에 사용하는 파일
// 열어보는게 좋음. 설정이 다 들어있기 때문에. 만지만 안됨 
@Configuration
public class Config {
	@Bean //스프링이 IoC 컨테이너로 관리하는 객체 
	public PhoneA phoneA() {
		return new PhoneA();
	}
	@Bean
	public PhoneB phoneB() {
		return new PhoneB();
	}
	@Bean //이름 설정을 별도로 하지 않으면 teemo1 <<메서드명이 등록됨 
			//같은 타입을 여러개 등록할 때에는 이름 설정해주는게 좋음
	public Teemo teemo1() {
		// 생성자 주입
		return new Teemo("작은 티모",new PhoneA());//필요한의존성을 채워서 만들어내는 방식
	}
	@Bean(name = "apple")
	public Teemo teemo2() {
		// setter 주입
		Teemo teemo = new Teemo();
		teemo.setName("큰 티모");
		teemo.setPhone(new PhoneA());
		return teemo;
	}
}
profile
이진 입니다

0개의 댓글