Spring
[ Spring ] 스프링 기초, 의존성 주입
hanjuCoding
2024. 7. 31. 12:46
🍃 Spring
- 객체지향, 디자인패턴
- 추가 라이브러리
- dbcp, mybatis
- security, jpa, thymeleaf → 스프링 부트할때 할거임
Spring framework 사용이유
: frame = 뼈대, 틀 → 누가 만들어도 구조가 비슷해져서 유지보수가 쉬워짐
bean이 객체를 관리할테니 개발자는 비즈니스로직을 처리해라!
- IOC : Inverse of control 제어 역행
- DI : Dependency Injection 의존성 주입
- AOP : Aspect-oriented Programming 관점지향
프로젝트 종류: Maven, Gradle
build(컴파일) : 컴파일 + 테스트 + 검증
스프링 주요 기능
- Core : 다른 기능과 설정을 분리하기 위한 IOC 제공
- Context : 애플리케이션의 각 기능을 담당하는 Bean에 대한 접근방법 제공
프로젝트 생성하기
- legacy project 생성 → 도메인은 거꾸로 입력 ex) kr.co.test
- pom.xml 수정
- 11번줄 java-version →11
- 141,142번줄 source, target →11
- project명 클릭 alt+f5 한다음 , force update of~ 체크하기
lombok같은 외부 라이브러리들은 mvnrepository에서 Maven의 소스를 복사해와서
pom.xml에 depency(119번줄)에 넣어준다.
- Bean 등록, 저장, 사용, 설정방법
- 빈등록 설정(xml, java 방식)
- 빈 이름, 타입(클래스)
bean으로 객체를 저장시에는 싱글톤으로 저장됨
//xml방식으로 생성된 bean 가져오기
//bean 설정파일(xml)을 읽어들임
//설정된 설정값으로 bean(객체)를 생성해서 container에 object로 저장
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("chapter01/beans.xml");
//컨테이너에서 꺼내야함(id로)
Person p1 = (Person)ctx.getBean("person");
System.out.println(p1.toString());
Person p2 = (Person)ctx.getBean("person");
System.out.println(p2.toString());
//true로 출력됨 -> 싱글톤객체임
System.out.println(p1==p2);
생성 - xml방식
//beans.xml
<bean id="person" class="chapter01.Person">
<property name = "name">
<value>홍길동</value>
</property>
<property name = "age" value="30"></property>
</bean>
//property name="name">에서 Person.setName()메서드를 실행시킨다.
//or
<bean id = "person2" class = "chapter01.Person">
<constructor-arg><value>이순신</value></constructor-arg>
<constructor-arg value= "25"/>
</bean>
생성 - java방식
@Configuration 어노테이션
@Configuration
public class JavaConfig {
//빈등록(메서드)
//빈이름 - 메서드 이름
@Bean
public Person person() {
return new Person();
}
}
//Configuration어노테이션은 bean을 수동으로 등록하기 위해, 또한 bean의 싱글톤을
//유지시키기 위해 사용
//java방식으로 생성된 bean 사용
public class MainByJava {
public static void main(String[] args) {
// 설정파일(자바파일) 읽어들이기
// 빈(객체) 생성, 컨테이너에 저장
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(JavaConfig.class);
Person p1 = (Person)ctx.getBean("person");
System.out.println(p1);
Person p2 = (Person)ctx.getBean("person");
Person p3 = (Person)ctx.getBean("person");
Person p4 = (Person)ctx.getBean("person");
}
}
@Bean 어노테이션
@Bean
public Person person() {
return new Person();
}//빈의 이름의 default는 "person"
//or
@Bean("test")
public Person person() {
return new Person();
}//빈의 이름은 "test"
xml & java 방식 둘 다 알아둬야함\
의존성 주입 ( Dependency Injection) ⭐️ ⭐️ ⭐️
A → B 의존관계 A객체 안에서 B객체 생성
객체가 필요로 하는 의존 객체를 외부에서 주입하는 방식으로, 객체간의 결합도를 낮춰준다.
이로 인해서 객체는 자신의 구현에만 집중하고, 변경에 유연하게 대응할 수 있다.
장점: 코드의 재사용성 증가, 유지보수성 향상, 객체간 결합도 감소, 단위 테스트 용이성 증가
스프링 프레임워크에서 사용하기 정말 조타!
public class MemberServiceimpl implements MemberService {
//MemberService안에는 이미 MemberDAO가 들어가있음
//(최초 실행시 스프링이 넣어줌)
MemberDAO dao;
public void setMemberDAO(MemberDAO dao) {
this.dao = dao;
}
@Override
public void regist() {
dao.regist();
}
}
@Configuration
public class BeanConfig {
@Bean
public MemberDAO memberDAO() {
return new MemberDAOimpl();
}//MemberDAO로 MemberDAOimpl을 리턴할 수 있는 이유는 DAOimpl이 DAO의 자식이기 때문
// @Bean
// public MemberService memberService() {
// return new MemberServiceimpl();
// }//여기는 오류남 아직 객체를 생성하지 않아 주입을 해주지 않았기 때문.
@Bean
public MemberService memberService() {
MemberServiceimpl m = new MemberServiceimpl();
m.setMemberDAO(memberDAO());
//memberDAO()는 메서드가 아니라 위의 memberDAO()빈이다.(오브젝트다)
return m;
}
}
public class MainByJava{
public static void main(String[] args) {
// TODO Auto-generated method stub
AnnotationConfigApplicationContext ctx
= new AnnotationConfigApplicationContext(BeanConfig.class);
MemberService m = ctx.getBean("memberService",MemberService.class);
//ctx에서 "memberService"이름을 가진 빈을 가져오고,
//이를 MemberService.class의 형태로 형변환 시켜준다
//왜냐하면 빈은 object.class이기 때문에 memberService m으로 받기위해
m.regist();
}
}
// '회원등록' 출력