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에 대한 접근방법 제공
  •  

프로젝트 생성하기

  1. legacy project 생성 → 도메인은 거꾸로 입력 ex) kr.co.test
  2. pom.xml 수정
    1. 11번줄 java-version →11
    2. 141,142번줄 source, target →11
  3. 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();
		
	}

}
// '회원등록' 출력