Java Collection Framework와 스프링 컨테이너

송현진·2023년 7월 24일

Spring

목록 보기
8/10
post-thumbnail

Collection

데이터의 집합(순서나 집합적인 저장공간)
데이터들을 효율적으로 관리할 수 있는 자료구조

List

중복되는 데이터들을 저장해야할 때, 배열에 들어간 순서를 유지하고 싶을 때 사용(중복 O, 순서 O)

  • ArrayList
    단방향 포인터 구조 데이터 순차적 접근(조회)이 빠름

  • LinkedList
    양방향 포인터 구조 데이터 삽입, 삭제가 빠름

Set

순서가 필요없고, set에 저장될 데이터가 중복이 되면 안될 때 사용(중복 X, 순서 X)

  • HashSet
    입력 순서 보장하지 않으며, 데이터 중복 허용하지 않음

  • LinkedHashSet
    입력 순서 보장하며, 데이터 중복 허용하지 않음

  • TreeSet
    입력한 데이터의 크기가 비교 가능한 경우 오름차순 정렬되며, 데이터 중복하지 않음
    입력하는 데이터가 사용자 정의 객체인 경우 Comparable을 구현해, 정렬 기준 설정 가능

Map

데이터를 저장할 때, key-value를 쌍으로 저장하고 싶을 때, 그리고 key를 중복 저장하고 싶지 않을 때 사용(key 중복 X, value 중복 O, 순서 X)

  • Hashtable
    null 값 입력 불가

  • TreeMap
    정렬된 순서대로 key-value를 저장하여 검색이 빠름

HashMap

index 번호 대신 key-value로 찾는 Map 형태의 자료구조도 iterator 클래스를 이용해 key-value를 순서대로 iterator에 저장해두면 순서대로 추출이 가능하다
중복울 허용하지 않으며 null 값이 올 수 있다

HashMap<String, String> hashMap = new HashMap<>();

hashMap.put("1","Hello1");
hashMap.put("2","Hello2");
hashMap.put("1","Bye1");
hashMap.put(null,"Null");

for(Map.Entry<String, String> e : hashMap.entrySet()){
	System.out.println("Key : "+e.getKey()+", Value : "+e.getValue());
}

Iterator<Map.Entry<String,String>> iter = hashMap.entrySet().iterator();
while (iter.hasNext()){
	Map.Entry<String, String> entry = iter.next();
	System.out.println("Key : "+entry.getKey()+", Value : "+entry.getValue());
}

Iterator<String> iter2 = hashMap.keySet().iterator();
while (iter2.hasNext()){
	String key = iter2.next();
	System.out.println("Key : "+key+", Value : "+hashMap.get(key));
}
----------출력값--------------
Key : null, Value : Null
Key : 1, Value : Bye1
Key : 2, Value : Hello2

💡 List, Set은 Collection 인터페이스를 상속받고 Map은 구조상의 차이로 별도로 정의한다.

스프링 컨테이너(Spring Container)

스프링에서 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할이다.
자바 객체는 스프링에서 빈(Bean)이라고 부른다.

왜 Spring에서 컨테이너 기능을 제공할까??

객체를 생성하기 위해서는 new 생성자를 사용해야 한다.
하나의 어플리케이션에는 수많은 객체가 존재하고 서로 참조하고 있다.
참조의 정도가 심할 수록 의존성이 높다고 표현한다.
낮은 결합도와 높은 캡슐화로 대표되는 OOP에서 높은 의존성은 그 특징을 잘 살렸다고 보기 힘들다.
의존성 제어. 즉, 객체간의 의존성을 낮추기(느슨한 결합) 위해서 Spring 컨테이너가 사용된다.

✏️ IoC란?
제어의 역전. 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것이다.

✏️ Bean의 생명주기
스프링 IoC 컨테이너 생성 -> 스프링 Bean 생성 -> 의존관계 주입(DI) -> 초기화 콜백 메소드 호출 -> 사용 -> 소멸전 콜백 메소드 호출 -> 스프링 종료

종류

(1) BeanFactory

  • 스프링 컨테이너의 최상위 인터페이스
  • Bean을 등록, 생성, 조회 등 Bean을 관리하는 역할을 하며, getBean() 메소드를 통해 Bean을 인스턴스화할 수 있다.

(2) ApplicationContext

  • BeanFacotory를 포함한 여러 인터페이스들을 상속받은 인터페이스(스프링 컨테이너하면 주로 ApplicationContext를 말함)

    MessageSource : 메세지 다국화를 위한 인터페이스
    EnvironmentCapable : 개발, 운영 등 환경을 분리해서 처리하고, 애플리케이션 구동에 필요한 정보들을 관리하기 위한 인터페이스
    ApplicationEventPublisher : 이벤트를 발행하고 구독하는 모델을 편리하게 지원하는 인테페이스
    ResourceLoader : 파일, 클래스패스, 외부 등 리소스를 읽어오기 위한 인터페이스

  • Bean을 관리하고 검색하는 기능을 BeanFactory가 제공하고, 그외의 부가 기능을 제공한다.

기능

  • Bean의 인스턴스화, 구성, 생명 주기 및 제거까지 관리
    • 컨테이너는 개발자가 정의한 Bean을 객체로 만들어 관리하고 개발자가 필요로 할 때 제공
  • 스프링 컨테이너를 통해 원하는 만큼 많은 객체 가질 수 있음
  • 의존성 주입(DI)를 통해 애플리케이션의 Component를 관리할 수 있음
  • 서로 다른 Bean을 연결하여 애플리케이션 Bean을 연결하는 역할
    • 개발자는 모듈 간 의존 및 결합으로 인해 발생하는 문제로부터 자유로울 수 있다
    • 메서드가 언제 어디서 호출되어야 할지, 메서드 호출하기 위해 필요한 매개 변수를 준비해서 전달하지 않는다

생성과 등록

  1. 스프링 빈 직접 등록
@Configuration
public class Config{
	@Bean
    public MemberService memberService(){
    	return new MemberService(memberRepository());	
    }
}
  1. 컴포넌트 스캔
    스프링 프레임워크에서 제공하는 @Controller, @Servcie, @Repository와 같은 어노테이션은 아래와 같이 인터페이스로 @Component 어노테이션을 받기 때문에 Component 등록 가능
...
@Component
public @interface Service{
	...
}

참고
Collection, Map 자료
Spring Container 자료

profile
개발자가 되고 싶은 취준생

0개의 댓글