xml설정대신 @위주로 설정하기때문에
부트가 더 편리함
요즘 스타트업은 부트를 쓸 확률이 높음
Ioc와 AOP를 지원하는 경량(POJO 기반)의 프레임워크
IoC
낮은 결합도
AOP
높은 응집도
객체를 생성 및 관리해주는 컨테이너로서의 기능도 제공함
-> 객체들 사이의 의존성(dependency)을 주입
웹 서버(톰캣같은게)가 기본적으로 내장되어있음
스타터 프로젝트를 사용하게 됨
-> 라이브러리 관리를 대신 해줌 (버전관리등: 최적화된 버전으로 알아서)
-> 기존 스프링에서 pom.xml로 라이브러리를 관리 해줬음
직접 버전 관리 해줘야 함
xml 설정대신 @위주로 설정
maven 대신 -> gradle 자동화 도구 이름
https://spring.io/tools
Spring Tools 4 for Eclipse
명령프롬프트로 압축해제
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(최초)요청을 한 상태
@RequestMapping
/에 대한 @이 존재하는지 확인
return VIEWNAME이 올바른지 확인
Q. 500 에러 발생!
>
JAVA 에러
NPE vs !NPE >> 1. chatGPT 2.구글링 3.선임 ▶ 에러 및 해결
주체(주어)가 NULL인 경우
xxx.메서드();의 xxx가 NULL인 경우
aaa.메서드(bbb);의 aa가 NULL인 경우
절대 bbb XXXXXX
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) 싱글톤 패턴
메모리에 같은 타입의 객체를 하나씩만 생성될수있도록 관리
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+"이(가) 정화거는중...");
}
}
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);
}
}
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 가 적을 수록 결합도가 낮아짐
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;
}
}