[ 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 |