본문 바로가기
Spring/spring

스프링 1일차 정리

by dyddyd0 2024. 7. 9.

 

인텔리제이 우측메뉴 - maven clean/install 활용해서 꼬인 dependency 풀어줄 수 있다.

설정정보 :

  • pom.xml
  • webapp패키지 → web.xml
  • webapp패키지 → WEB-INF 패키지 → spring 패키지 → root-context.xml
  • webapp패키지 → WEB-INF 패키지 → spring 패키지 → appServlet 패키지 → servlet-context.xml

 

apache - 클라이언트 요청을 받아주는 서버 (WEB서버)

tomcat - 실제 웹 애플리케이션 실행하는 서버 (WAS)

apache-tomcat 폴더의 conf 폴더 확인

 

ㄴspring (개발 뼈대를 제공해줌으로써)

  • 빠른 구현시간
  • 유지보수 용이성
  • 개발능력 획일화+인건비 감소
  • pom.xml을 통한 수월한 라이브러리 관리
  • 의존성 관리 (Dependency Injection/Lookup) :
    자동으로 의존성에 알맞은 객체를 찾아주고(DL) 찾은 객체를 넣어줌(DI)
  • IOC (Inversion Of control 제어의 역전) : 기존 개발자들이 하던 일을 스프링이 대신해 주어 제어가 역전됐다 함.
  • AOP : 공통기능은 모두 설정파일로 빼두고 , 오직 기능에만 집중하게, 관점지향적으로 프로그래밍할 수 있도록 도움 / 거의 트랜잭션 기능만 남아있음

결합도는 낮추고 응집도는 높이며 개발하자

-->

인터페이스 생성

 

 

bean 엘리먼트: 스프링 컨테이너가 자동으로 객체를 생성하고 생명주기를 관리해야 할 클래스들을 등록할 때 사용하는 엘리먼트. 주로 라이브러리들의 클래스를 등록한다. 개발자가 직접 작성한 클래스들은 어노테이션으로도 객체를 생성할 수 있지만 라이브러리로 참조한 클래스들에는 어노테이션을 추가할 수가 없기 때문에 필요한 라이브러리 클래스들은 bean 엘리먼트로 등록한다.

 

 

bean 엘리먼트의 속성

  • init-method: bean 엘리먼트로 등록된 클래스가 스프링 컨테이너에 의해서 자동으로 객체가 생성될 때 호출될 메서드를 지정할 수 있는 속성. bean 엘리먼트로 등록된 클래스 중 초기화가 필요한 클래스들은 init-method로 초기화를 진행한다.
  • destroy-method: 스프링 컨테이너에 의해서 객체가 삭제되기 전에 수행할 내용을 메서드로 작성 후 매핑.
  • lazy-init: 객체의 생성 시점을 지정. true나 false로 지정. 기본 값을 false로 지정되어 스프링 컨테이너가 구동되면서 바로 객체 생성. true 지정 시 사용자가 그 객체를 요청했을 때 객체를 생성
  • scope: 객체 생성 방식 지정. 기본적으로 singlton 형태(객체를 하나만 생성하여 공유)로 객체를 생성하여 하나의 객체를 공유하는 방식. singleton, prototype으로 속성 값을 지정할 수 있고 singleton이 기본 값, prototype으로 지정 시 요청 때마다 객체를 생성

의존성 주입!

 

1. 생성자 주입 : Spring_DI_Constructor

 

constructor-arg : **생성자의 매개변수를 전달하는 엘리먼트.**
일반적인 값을 매개변수로 전달할 때는 value 속성으로 지정. bean 객체 타입의 값을 매개변수로 전달할 때는 ref 속성으로 지정.

 

매개변수 개수만큼의 생성자를 호출할 수 있음.

ex)

<bean id="HyundaiCar" class="com.bit.springboard.coupling.HyundaiCar"init-method="initMethod" destroy-method="destroyMethod"lazy-init="false">
<!--기본생성자 사라지고 매개변수가 있는 생성자로 바뀌어 설정바꿔줌.-->
<!--constructor-arg : **생성자의 매개변수를 전달하는 엘리먼트.**
                        일반적인 값을 매개변수로 전달할 때는 value 속성으로 지정.
                        bean 객체 타입의 값을 매개변수로 전달할 때는 ref 속성으로 지정.
-->
    <constructor-arg ref="carAudio"></constructor-arg>
    <constructor-arg ref="carAudio"></constructor-arg>
    <constructor-arg ref="carAudio"></constructor-arg>
</bean>

3개의 매개변수를 갖는 생성자를 자동으로 호출하는 것.

 

<bean id="HyundaiCar"
 class="com.bit.springboard.coupling.HyundaiCar"
 init-method="initMethod" destroy-method="destroyMethod"lazy-init="false">
</bean>

매개변수가 없는 생성자를 자동으로 호출.

 

 

<constructor-arg value="Red" index="1"></constructor-arg>
<constructor-arg ref="carAudio" index="0"></constructor-arg>

 와 같이 <constructor-arg> 순서를 바꾸면 매개변수 전달이 꼬이게 되는데, 이때 index속성을 지정해 줄 수 있다.

--> 매개변수 순서를 인덱스와 맞춰 제대로 전달 가능

 

인터페이스를 만들어 상속받으면 (SonyCarAudio, AppleCarAudio) ⇒ (implement CarAudio)

결합도(의존성을) 낮춰 코드의 수정을 최소화할 수 있다.(root-context.xml 부분 하나만 수정해 주면 됨.)


2. Setter 주입 : Spring_DI_Setter

 

Setter 실행 →(setter 매개변수로 값을 넘겨서 설정해 주는 거)

설정 파일에 추가 - xmlns:p="<http://www.springframework.org/schema/p>"

 

`<!-- p namespace : property 엘리먼트를 간편하게 설정할 수 있는 네임스페이스.
     bean 엘리먼트의 속성으로 property 엘리먼트를 지정할 수 있다.
     p: 변수명 : 리터럴 값으로 setter 메소드 실행.
     p: 변수명-ref : bean 객체를 참조하여 setter 메소드 실행.
     -->
    <bean id="hyundaiCar" class="com.bit.springboard.coupling.HyundaiCar"
          p:carAudio-ref="sonyCarAudio" p:color="Blue2"/>`

 


3. 필드 주입 : Spring_DI_DL_Annotation 스프링에서 권장하지 않고 지양하는 방법이다.

 

@Autowired 어노테이션을 이용한 DI

@Component
public class HyundaiCar implements Car {
    // 필드 주입
    // @Autowired : 선언 된 변수의 형태 객체가 bean 에 등록되어있는지 검사하고,
    // 등록되어 있으면, 그 객체에 의존성 주입하는 어노테이션.
    @Autowired
    private CarAudio carAudio;

오토와이어 어노테이션으로 의존성을 주입하고,
컴포넌트 어노테이션을 클래스에 달아주어서 스프링 컨테이너가 컴포넌트 스캔 가능하도록 (빈 객체로 등록 가능하도록) 만듦.

 

public class CarOwnerAnnotation {
    public static void main(String[] args) {
        AbstractApplicationContext factory =
                new GenericXmlApplicationContext("root-context.xml");
        HyundaiCar hCar = (HyundaiCar) factory.getBean("hyundaiCar");
        hCar.volumeUp();
        hCar.volumeDown();
        factory.close();
    }
}

ApplicationContext (스프링 컨테이너 - Bean 객체 관리)에서 사용하는 메서드 getBean()

getBean으로 가져올 때 빈 아이디로 “클래스 명 첫 글자를 소문자로 바꾼 아이디로” 지정한다.

--> 빈 이름의 경우, 따로 명시해주지 않으면 기본적으로 클래스 이름의 첫 글자를 소문자로 바꾼 것이 빈 이름으로 설정되기 때문. ( .getBean("hyundaiCar") 부분.)

 

 

SonyCarAudio와 AppleCarAudio 두 클래스에 모두 @Component 어노테이션을 달아두면, 어떤 빈을 등록할지 명확하지 않아서 오류 발생한다.

—> @Qualifier로 어떤 CarAudio 인터페이스의 구현체를 사용할지 를 지정해서 해결해 준다.

 

`@Autowired
// @Qualifier : bean 객체가 의존성 주입할 때 같은 타입의 객체가 두 개 이상일 때 객체의 아이디로
// 하나의 객체만 특정할 수 있도록 하는 어노테이션. @Autowired 와 항상 같이 사용해야된다.
@Qualifier("sonyCarAudio")
private CarAudio carAudio;` 

`//@Resource : @Autowired + @Qualifier 두 기능이 합쳐진 기능(jakarta Annotation API (dependency) 추가해서 사용할 수 있다.)
@Resource(name = "sonyCarAudio")
private CarAudio carAudio;`

 

 

생성자 2를 제외한 다른 생성자 가 없으면,
생성 순서에 따른 스프링 빈 등록에서 생성자 호출의 순서가 (위 코드와) 달라진다.

@Autowired
public  HyundaiCar(@Qualifier("sonyCarAudio") CarAudio carAudio) {
    System.out.println("Hyundai Car 생성자2 호출");
    this.carAudio = carAudio;
    }

생성자 에서 필드주입

 

 

생성자가 없어도 기본생성자를 자바에서 만들어 주기 때문에 출력을 보기 위한 생성자 1 은 남겨두었다.

@Autowired
public void setCarAudio (@Qualifier("sonyCarAudio") CarAudio carAudio) {
    System.out.println("HyundaiCar setCarAudio 호출");
    this.carAudio = carAudio;
    }

 

setter 에서 필드주입


 

AOP (응집도와 관련) Aspect Oriented Programming

 

비즈니스 컴포넌트 MVC 패턴 (Model - 비즈니스 컴포넌트, Veiw - 화면, Controller - 서블릿)...

 

반응형

'Spring > spring' 카테고리의 다른 글

스프링 6일차 정리  (0) 2024.07.17
스프링 5일차 정리  (0) 2024.07.16
스프링 4일차 정리  (0) 2024.07.14
스프링 3일차 정리  (0) 2024.07.11
스프링 2일차 정리  (0) 2024.07.10