주니 개발 도서관

Spring boot

[ Spring boot ] 의존 주입

주니홍 2022. 10. 24. 15:50

[ Spring Boot ] 의존 주입

 

이전 글을 보고 오시면 좋습니다 >> 프로젝트 생성 이후 부분입니다!

https://hongjuni.tistory.com/75

 

[ Spring Boot ] 다운로드 및 설정

[ Spring Boot ] 설치 및 설정 기존의 빈 (Bean) 설정 XML 사용안함 >> @(어노테이션) 사용 ( 강사님이 이전프로젝트에서 부트형식으로 해주심 ) 빈 등록을 위한 설정파일 (.xml) 이 불필요해지므로 자바 

hongjuni.tistory.com

 

일단 port 설정부터 바꿔줘야 할 것 같습니다

내장된 톰캣 서버의 기본 포트 번호는 8080 인데

오라클을 8080포트로 사용하고 있기때문에

함께 사용하면 충돌 발생
>> application.properties에서 설정
>> server.port=8088

 

 

 

 

build.gradle

>> pom.xml 대신 쓰이는 친구
>> 내부를 확인해보면 pom.xml과 다르게 dependecies가 간편 & 버전 관리도 대신 해준다 **

 

 

 

[ 의존 주입 방법 3가지 ]

1. xml 설정

2. 자바 코드 작성

3. @

 

2번 >> 3번으로 업그레이드 하는 느낌으로 표현해보겠습니다

 

interface 생성

 

implements 사용한 A, B 클래스 생성

 

 

위의 Member 인터페이스 객체를 멤버변수로 가진 Leader 클래스 생성

 

 

 

 

** 스프링 컨테이너 설정파일 역할을 해줄 클래스 생성

@Configuration 어노테이션을 설정해준다

 

빨간박스 =   세터  인젝션  (세터 주입)

 

@Bean으로 name을 설정하지 않으면 디폴트로 메서드명을 name으로 대입
leaderA 와 leaderB로 비교되기때문에 오류는 안나오지만 리턴값이 동일하므로 불편할것 같다

그렇기때문에 name 설정을 해주는 것이 좋다!

 

 

 

 

프로젝트를 생성시 기본적으로 생성되는 main인 TestApplication 내부에

직접 호출하여 객체를 사용해보자

** @SpringBootApplication 주석처리 + main 내부 SpringApplication.run 주석처리 **

 

1. ApplicationContext ac=new AnnotationConfigApplicationContext(Config.class);

- @Configuration으로 설정한 Config 클래스를 인자에 넣어 설정

- Config 설정 파일에서 설정한 내용이 ac에 주입된다

 

2. ac.getBean( "@Bean name" );

인자로 @Bean으로 설정한 name을 인자로 Object로 반환해줌

형변환이 꼭 필요함! ( 어떤 객체가 담길지 모르기때문에 Object 인 것 )

- name을 설정하지 않았다면 메서드명이 name이 된다

- leader1 에는 leaderA 안의 내용이 주입되고 ( A멤버 + 티모 + 안녕하세요!)

- leader2 에는 kim (leaderB) 안의 내용이 주입된다 ( A멤버 + 아리 + 안녕하세요! )

- member에는 memberB 안의 내용이 주입된다 ( B 멤버 + String값 )

 

콘솔 결과

 

 

 

 

2번 >> 3번으로 업그레이드

 

@ 어노테이션을 추가하여 Config 클래스를 삭제해보자!

 

 

MemberA 와 B를 @으로 객체화한다

 

 

 

 

Leader 클래스에도 @ 을 추가하여 객체화

@Value("티모") name에 주입

 

@Autowired = 객체를 찾아 @으로 생성된 객체를 주입해줌

@Qualifier = @으로 생성된 객체가 여러개일경우 하나를 확실히 찾아 넣어주기 위해 사용

                     " memberA " 이름으로 @으로 객체화한 객체로 주입

 

 

 

TestController 클래스 생성하여 @RequestMapping 으로 " / " 요청에 반응하도록 설정

@Autowired로 leader1 , leader2 >> @으로 객체화 한 객체를 주입

 

member 또한 Qualifier으로 "memberB"로 객체화 한 객체를 주입

 

public String root() 로 사용시

return 타입에는 .jsp or .do 요청으로 가야한다

 

@ResponseBody를 추가해주면 return 타입의 String 자체를 웹에 출력해줌

** Ajax를 이용할때 자주 활용됨

 

root() 내부 코드

23번 라인 leader1.hello()  ( 멤버 A + 티모 + 안녕하세요! )

24번 라인 leader1.setMember(member)

               >> ( TestController 멤버변수 member 객체에 담겨진 memeberB가 set됨 )

25번 라인 leader1.hello() ( 멤버 B + 티모 + 안녕하세요 ! )

= 티모는 leader의 @Value ("티모") 설정에 의해 고정

 

if ( leader1 == leader2 )

이름이 다른객체여서 false가 나올줄 알았으나

" 싱글톤 패턴 " 을 유지하기때문에 true가 나온다!!!

 

 

 

 

** @SpringBootApplication + 내부의  SpringApplication.run

 

@SpringBootApplication
Bean(객체)들을 생성할때, 싱글톤을 유지할 수 잇도록 설정 및 관리
각각의 객체들이 생성되면 용이한 순간을 추측하여 메모리를 관리
=> 스프링 컨테이너가 효율적으로 동작할 수 있도록 도와준다
=> .jar 파일들도 생성 및 설정 관리 (Dependencies도 관리해줌)
=> @ 지정된 클래스를 스캔해서 Bean 등록 관리

 

SpringApplication.run(Test2Application.class, args)

=> 내장 톰캣 실행

=> ApplicationContext 생성 == 스프링컨테이너 실행

           >> URL로 요청시 RequestMapping에 의해 작성한 메서드가 호출되는 방식

 

 

지구본을 실행하면 웹으로 확인이 가능하다!

 

 

 

@RequestMapping( " / " ) 에 의해서 불러진 메서드 내부에서

@ResponsBody 리턴에 의해 " 루트(표지) 페이지 " 가 웹에 출력되고

 

추가적으로 콘솔에 로그도 확인가능

예상대로 결과가 나왔는데

 

동일한 객체 입니다 **

leader1 == leader2 가 동일한객체라는 뜻인데

즉, 싱글톤 패턴이 잘 적용되고 있다는 것이다

'Spring boot' 카테고리의 다른 글

[ Spring Boot ] 트랜잭션  (0) 2022.11.01
[ Spring boot ] JDBCTemplate  (2) 2022.10.27
[ Spring boot ] Validator ( 유효성 검사 )  (0) 2022.10.26
[ Spring Boot ] 부트 웹 기초  (0) 2022.10.25
[ Spring Boot ] 다운로드 및 설정  (0) 2022.10.24