[Spring][국비교육] Day 90

Ga02·2023년 5월 8일

국비교육

목록 보기
77/82

🔍 MAVEN, 메이븐

빌드 관리 도구

  • 프로젝트가 빌드(build)될 때 필요한 라이브러리 파일(.jar)들을 자동화하여 관리하는 툴
  • pom.xml 파일을 설정 파일로 사용
    👉🏻 빌드 방법, 빌드에 필요한 라이브러리의 버전들을 기록
  • .jar 파일들을 프로젝트에 직접 설치(추가)하지 않고 MAVEN을 통해 관리

프로그램 라이프 사이클
소스코드 작성 ➡ 컴파일 ➡ 바이트코드 ➡ 빌드 ➡ 실행
빌드, build
개발자 코드(바이트코드)와 라이브러리 코드(.jar, 바이트코드)를 결합하려 JVM이 실행할 수 있도록 완성하는 작업

➰ pom.xml 파일

메이븐 도구의 설정 파일

  • Project Object Model
  • 프로젝트 정보
  • 메이븐이 사용할 상수 정보
  • 의존성 라이브러리
  • 빌드 정보
  • 라이브러리를 다운받을 저장소 설정

➰ 라이브러리 의존성 설정 태그

<dependencied>태그의 자식으로 <dependency>태그로 설정

  • droupId : 라이브러리들을 서로 구분하기 위한 값(주로 패키지)
  • artifactId : 라이브러리 파일의 이름
  • version : 라이브러리의 버전

➰ 메이븐 충돌(오류)이 발생한 상황 처리하기

  • pom.xml 파일의 설정항목이 정상적인데 서버가 켜지지 않는 경우
  • 서버를 시작할 때 이클립스 콘솔에 예외 메시지가 뜸
    invalid LOC header 문구가 떠있는 경우
    java.lang.lassNotFoundException: ~~ 예외 문구가 떠있는 경우
  • 메이븐이 오류가 발생한 후 정상적으로 pom.xml을 설정해도 이클립스가 정상 상황을 인식하지 못하는 경우

➰ 해결 방법

  1. STS(이클립스)를 끔
  2. 메이븐 라이브러리의 로컬 저장소 폴더를 삭제
    c:\USER\{사용자이름}\.m2\repository\
  3. STS(이클립스)를 켬
  4. Progress탭을 확인하고 작업을 기다림
  5. 메이븐 도구가 프로젝트 환경을 다시 구축하는걸 확인(build)
  6. 해결!
    ✔ 해결되지 않으면 메이븐 문제가 아니므로 다른 원인을 찾음

🔍 Spring Legacy Ptoject (Spring MVC Project) 폴더 구조

➰ src/main/java

Java Source 폴더로 등록되어 있음

  • 개발된 .java 파일들이 보관되는 폴더
  • MVC 프로젝트의 패키지 구조가 만들어지는 곳
    (controller, service, dao, dto, ...)
  • 백엔드 개발(서버 프로그램 개발)이 이루어지는 곳

➰ src/main/resources/

Java Source 폴더로 등록되어 있음

  • 자바 프로그램 개발에 필요한 자원(주로 파일)들을 보관하는 폴더
  • 라이브러리와 관련된 설정 파일(.xml)들을 주로 보관

➰ src/main/resources/log4j.xml

Log4J 라이브러리의 설정 파일

  • Log4J 라이브러리(Logging For Java)
    • 자바 프로그램에서 로그를 다양한 출력 장치로 내보낼 수 있도록 만들어진 라이브러리
  • slf4J 라이브러리(Simple Logging Facade For Java)
    • Log4J 로그 라이브러리의 추상화된 객체를 제공
    • 로그관련 객체가 인터페이스화 되어있음
    • slf4j라이브러리의 객체를 이용하여 log4j 라이브러리를 실행

➰ src/test/java

➰ src/test/resources/

단위 테스트용 소스코드와 자원을 보관하는 폴더(패키지)
❌우리는 사용하지 않음❌

➰ Server Runtime

Tomcat Server 실행환경 라이브러리

  • servlet-api.jar, jsp-api.jar를 포함시켜 줌

➰ Maven Dependencies

메이븐으로 추가된 라이브러리들을 보여주는 곳
사용자 폴더에 있는 .m2라이브러리 로컬 저장소 폴더와 연결되어 있음
프로젝트에 작성해둔 pom.xml 파일의 설정 항목에 영향을 받음

➰ JRE System Library

Java Runtime Environment 라이브러리, 자바 실행 환경

  • 연결된 JRE가 보이는 곳

➰ src/main/webapp

서버 도메인 URL의 루트 디렉토리와 연결된 폴더

➰ src/main/webapp/resources

프로젝트의 정적 응답용 자원들을 모아놓는 폴더 👉🏻 css, js, image 등

  • servlet-context.xml에 설정한 <resources> 태그에 적용되어 있음

➰ src/main/webapp/WEB-INF/

스프링 프로젝트에 대한 설정파일 또는 응답용 JSP파일(View)을 모아놓음

  • WEB-INF폴더는 클라이언트의 URL 요청으로 직접 접근할 수 없도록 막아놓은 폴더

➰ src/main/webapp/WEB-INF/classes/

프로젝트에는 비어있는 폴더

  • 서버로 배포되었을 때 .class(바이트코드)가 모이도록 준비된 폴더

➰ src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml

스프링에서 사용되는 컨텍스트 정보를 설정

  • 요청&응답에 관련된 컨텍스트 설정을 주로 적용
  • Controller, Service, View에 관련된 설정 정보를 등록

➰ src/main/webapp/WEB-INF/spring/root-context.xml

스프링에서 사용되는 외부 컨텍스트를 설정
웹 어플리케이션과 관련된 컨텍스트 설정 정보를 등록
외부 라이브러리를 이용한 동작 설정을 주로 적용

➰ src/main/webapp/WEB-INF/views/

MVC패턴에서 사용되는 View(JSP파일)들을 보관하는 폴더
컨트롤러에서 forward하는 대상 파일들을 주로 보관

➰ src/main/webapp/WEB-INF/web.xml

배포 관리자, Deployment Desceiptor, DD
프로젝트가 웹 서버에 배포될 때 필요한 설정을 적어두는 파일
요청&응답에 관련된 웹 서버 설정 항목을 넣음
DispatcherSevlet을 설정하고 있음

➰ src/test/

단위 테스트용 파일을 보관하는 폴더
❌우리는 사용하지 않음❌

➰ target/

자바 소스코드(.java)에 대한 컴파일 결과물(.class)이 모이는 폴더
서버로 배포되기 전 파일들이 모이는 곳

➰ pom.xml

메이븐(MAVEN) 도구의 설정 파일
메이븐으로 추가할 라이브러리를 <dependency>태그를 이용하여 설정


🔍 스프링의 대표적인 특징

1. Spring MVC
MVC 디자인패턴을 기반으로 만들어진 프레임워크

  • Model, View, Controller 컨포넌트를 스프링 프레임워크가 주도적으로 관리

2. POJO 개발
Plain Old Java Object

  • 상속(클래스, 인터페이스)을 줄여서 개발 👉🏻 결합도를 낮춤

3. AOP 관점지향 프로그래밍
Aspect Oriented Programming

  • 여러 컴포넌트(객체)들에서 공통적으로 수행하는 기능들을 따로 분리하여 재사용성있게 개발하는 기술

    👀 Example
    모든 Controller에서 요청이 시작되면 요청 URL을 Console창에 출력
    ➡ 요청 URL 출력코드를 개발하고 모든 Controller에서 자동으로 실행되도록 AOP를 설정

4. IoC, 제어의 역전, 제어 반전
Inversion of Control

  • 프로그램 코드(컴포넌트)들의 실행 흐름을 스프링 프레임워크가 결정함
  • 객체의 생명주기(생성, 호출, 파괴)를 프레임워크가 관리

5. DI, 의존성 주입
Dependency Injection

  • 컴포넌트들 간의 의존성 관계를 관리하는 기술
  • 컴포넌트들의 의존성을 외부(스프링 프레임워크)에서 주입받음
    의존성, Dependency : 객체가 실행될 때 필요한 다른 객체와의 연결 상태(관계)

➰ 의존성, Dependency

객체가 작동하기 위해 필요한 외부 객체와의 연결

public class EmpContorller {

	//EmpController객체는 EmpService 객체에 의존적
	private EmpService empService = new EmpServiceImpl();
}

➰ 의존성 주입, Dependency Injection, DI

객체가 직접 의존성을 발생시키지 않고 외부의 도움을 받아 의존성이 주입되는 현상

  • 생성자 의존성 주입, Constructor DI
  • Setter 의존성 주입, Setter DI

여기까지 하고 코드친다~
Simple에 di 패키지 만들기

tire 인터페이스 / gold, silver는 class
dependency 먼저하고 constructor 하고 setter 함
다 하고 di.xml 만들엇삼 class 만들고 밑에 이거 spring에 등록하기 위해 만들기


이거 중 beans와 beans을 많이 쓰게 될 것 특히 bean

이렇게 체크하고 src로 넘어가보면

추가되어 있을 것~
ctrl + space를 눌러보면 이것도 늘어나 았음


버전이 안써있는걸 쓰면 디폴트(4.3)으로 들어감 -> 문서 유형 버전

그래서 이렇게 두번째줄 맨 뒤에 버전을 넣어줘도 안넣어줘도 됨

우리는 컨텍스트 등록만 해볼꺼니까 beans 빼고 지울겡
servlet-context.xml 구경가보자 beans 사실 왜 갔는지 모르겠ㅇㅓ
an, re는 mvc꺼


setter 지우고 생성자버전으로 만들어볼게용
생성자 필요 di.xml.Car.jave 수정


이런 오류가 날 것
디폴트생성자가 없어서 di.xml 파일에서 오류나

이렇게,, 그래서 디폴트 생성자를 만들어줘야함~

그ㄹㅐ도 실행은 여전히 오류남
당연함! 매개변수로 생성자 전달(주입)을 안해줬음
생성자가 호출되는 시점은 바로 여기

얘가 호출되면 바로 로출 및 생성이 되는데 매개변수가 없는거야
그래서 bean에 매개변수도 같이 생성되도록 해줘야함

이런식으로 들어갈걸 직접 지정 / 문자열인 경우, 숫자인 경우

ref 속성을 이용해 bean으로 등록된걸 넣을 수 있음
매개변수가 여러개인 경우

이렇게 여러개 넣어주면 됨
이제 car1은 디폴트 생성자를 이용해서 setter로 의존성 주입하는거고, car2는 매개변수 있는 생성자를 통해 호출과 동시에 의존성 주입~


🔍 스프링 빈을 등록하는 태그

스프링 빈 설정 xml 파일(Bean Configuration XML)을 이용하여 스프링 빈을 등록

  • <bean> 태그를 이용
    (spring-bean 모듈 namespace가 필요)
  • <bean> 태그의 자식 태그를 이용하여 멤버필드에 DI할 수 있음

멤버필드 DI없이 스프링 빈 등록

<bean id="등록할 스프링빈 이름" class="객체를 생성할 클래스" />

멤버필드 DI하며 스프링 빈 등록

<bean id="등록할 스프링빈 이름" class="객체를 생성할 클래스">
    <!--Setter DI --!>
	<property name="멤버필드명" ref="의존성 주입할 Bean이름"/>
	
	<!-- Constructor DI --!>
	<constructor-arg ref="의존성 주입할 bean 이름" />
</bean>

package autowired 만들었어 class Car 만들고용
멤버필드에 @Autowired 걸어주면 적당한 애 골라서 알아서 주입해준대
적당한 애를 고를 수 있도록 컨텍스트 정보 등록해줄게
아까 만든 Spring 어쩌구 파일 diAutiwired 이름으로 만들어줄게

이렇게 빈 등록~
그러고 Person을 만들어줄게용


컨텍스트 추가해주고

이거 추가해주기
근데 아직 끝이 아님~

빈 설정이 유일하지 않아서 생기는 문제래
di.tire.Tire과 맞는 bean을 찾지 못했대
싱글 매칭을 기대했는데 두개래 그래서 못골라서 못햇대 -> 에러 해석~
데이터타입 기반으로 자동적용하는데 지금 그 타입의 컨텍스트 정보가 골드랑 실버 두개라서 안돼 못골라~
둘 중 하나 주석처리해서 지워볼게

하나 지우면 됨

둘 다 되지롱
둘 중 하나 고르고 싶은 경우 둘 다 주면 못고르니까
@Autowired에다가 추가로 어노테이션을 해줘야해

이렇게 이름을 써주면 이름이랑 일치하는 애들 찾아다가 해준대

둘 다 주석 푼 상태에서 실챙하면 sTire가 자동선택~


🔍 @Autowired의 바인딩 전략

DI가 진행될 바인딩 처리의 우선순위

  • @Autowired에 의해서 객체 변수와 스프링 빈이 연결되는 것을 뜻함
  • DI를 통한 연결

1. byType 전략

  • 객체 변수의 타입과 같은 스프링 빈을 바인딩 함
  • 객체 변수에 대입할 수 있는 타입을 선택
  • 등록된 스프린 빈의 이름과는 상관없이 데이터 타입을 우선으로 적용 👉🏻 byName보다 우선
  • 같은 타입으로 등록된 빈이 2개 이상이면 예외가 발생 ➡ NoUniqueBeanDefinitionException

2. byName 전략

  • 같은 타입으로 등록된 빈이 여러 개 있을 경우 같은 이름의 스프링 빈을 바인딩함
  • 객체 변수의 이름과 등록된 스프링 빈의 id 속성 값을 비교해서 같으면 바인딩됨


@Qu 어쩌구 지우고 alt shift r 눌러서 한번에 이름을 sTire로 바꾸면

xml파일에서 둘 다 주석이 풀려있어도 에러가 나지 ㅏㅇㄶ음
반대로 해도 똑같은~ alt shift r 눌러서 한번에 이름을 gTire로 바꾸면


에러 안남
강사님꺼 그대로 임포트하면 설정 안맞아서 어려울 수 있대
패키지만 복붙해서 하는거 추천하신대

profile
IT꿈나무 댓츠미

0개의 댓글