[ IoC(Inversion of control) ]

  • 제어의 역전
  • 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 제어의 역전이라고 한다.
  • 클라이언트 클래스가 직접 구현체를 컨트롤하는 것이 아닌 외부의 Config클래스를 통해 구현체를 받고 클라이언트 클래스는 실행에만 신경을 쓰는 것을 의미한다.

[ DI(Dependency Injection) ]

  • 의존관계 주입
  • 정적인 클래스 의존관계와, 실행 시점에 결정되는 동적인 인스턴스 의존관계 둘을 분리해서 생각해야 됨
  • 정적인 클래스 의존관계를 보면 import코드만 보고 의존 관계를 쉽게 판단할 수 있다.(실행하지 않아도 파악이 가능함)
  • 동적인 인스턴스 의존관계는 애플리케이션 실행시점에 실제 생성된 객체 인스턴스의 참조가 연결된 의존관계
    • 애플리케이션 실행 시점에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전당 해서 클라이언트와 서버의 실제 의존관계가 연결되는 것을 의존관계 주입이라고 함
    • 클라이언트 코드를 변경하지 않고 클라이언트가 호출하는 대상의 타입 인스턴스를 변경할 수 있다.
    • 정적인 클래스 의존관계를 변경하지 않고, 동적인 객체 인스턴스를 쉽게 변경할 수 있다.

[ 컨테이너(IoC & DI Container) ]

  • 객체를 생성하고 관리하면서 의존관계를 연결해주는 것을 Container라고 한다.
  • 의존관계 주입에 초점을 맞추어 최는 에는 주로 DI컨테이너라고 함
  • 또는 어셈블러, 오브젝트 팩토리 등으로 불리기도 함

 

[ 스프링 컨테이너 ]

  • ApplicationContext를 스프링 컨테이너라고 한다.
  • @Configuration 이 붙은 class를 설정 정보로 사용하며, 클래스 안에 @Bean이라고 적힌 모든 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록하며, 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.
  • 등록된 빈을 applicationContext.getBean()메서드를 통해 가져올 수 있다.
  • 관례상 @Bean이 붙은 메서드의 명을 스프링 빈의 이름 그대로 사용한다.

'Back-end > Spring' 카테고리의 다른 글

스프링이란?  (0) 2022.02.04
File Download  (0) 2021.11.05

- 2002년 로드 존슨이 EJB의 문제점을 지적하면서 EJB 없이도 충분히 고품질의 확장 가능한 애플리케이션을 개발할 수 있음을 보여주면서 30,000라인 이상의 기반 기술을 예제 코드로 선보인 책을 출간함.

 

로드 존슨의 책 출간 직후 유겐 휠러, 얀 카로프가 로드 존슨에게 오픈소스 프로젝트를 제안했고 그때 만들어진 오픈소스가 스프링의 기반이 됨

 

[ 스프링 생태계 ]

- 필수

  • 스프링 프레임워크
  • 스프링 부트

- 선택

  • 스프링 데이터
  • 스프링 세션
  • 스프링 시큐리티
  • 스프링 Rest Docs
  • 스프링 배치
  • 스프링 클라우드
  • 등...

 

[ 스프링 프레임워크 ]

  • 핵심 기술 : 스프링 DI 컨테이너, AOP, 이벤트 기타
  • web 기술 :  스프링 MVC, 스피링 WebFlux
  • 데이터 접근 기술 : 트랜잭션, JDBC, ORM, XML
  • 기술 통합 : 캐시, 이메일, 원격 접근, 스케줄링
  • 테스트 : 스프링 기반 테스트 지원(JUnit)
  • 언어 : 자바, 코틀린, 그루비

 

[ 스프링 부트 ]

  • 스프링을 편리하게 사용할 수 있도록 지원하며 tomcat 같은 웹 서버를 내장하고 있으므로 웹 서버를 별도로 설치하지 않아도 됨
  • 스프링과 3rd parth라이브러리 자동 구성
  • starter 종속성 제공
  • 관례에 의한 간결한 설정
  • 최근 추세는 스프링 부트를 사용하는 방향으로 가고 있다.

 

스프링은 DI(Dependency Injection)과 DI 컨테이너를 제공하기 때문에 객체지향의 5가지 원칙 중 OCP, DIP를 잘 지킬 수 있게 만들어 준다. 클라이언트 코드의 변경 없이 기능 확장이 가능하며 쉽게 부품을 교체하듯이 개발을 할 수 있다는 점이 스프링의 장점이다.

'Back-end > Spring' 카테고리의 다른 글

IoC, DI, 컨테이너  (0) 2022.02.07
File Download  (0) 2021.11.05
//File Download
	// import org.springframework.http.MediaType
	// import org.springframework.core.io.Resource;
	// import org.springframework.http.HttpHeaders;
	// APPLICATION_OCTET_STREAM_VALUE => download할 수 있는 mime type
	// User-Agent : HTTP Header Message 중 디바이스의 정보를 제공
	//				(웹 브라우저의 종류, 모바일, 데스크탑)
	//				IE에서 처리시 따로 처리가 필요함
	@GetMapping(value = "/download", 
				produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
	public ResponseEntity<Resource> downloadFile(@RequestHeader("User-Agent") String userAgent,
			String fileName) {
		// file 위치
		String path = "/Users/andaegeun/Desktop/dditSpring/springProj/src/main/webapp/resources/upload/";
		
		logger.info("download file : " + fileName);
		
		Resource resource = new FileSystemResource(path + fileName);
		
		// 파일이 없을때
		if(!resource.exists()) {
			//jsp에서 에러페이지로 넘기기
			return new ResponseEntity<Resource>(HttpStatus.NOT_FOUND);
		}
		
		logger.info("resource : " + resource);
		
		//file명 가져오기
		String resourceName = resource.getFilename();
		//file명이 한글이면	
		HttpHeaders headers = new HttpHeaders();
		
		try {
			String downloadName = null;
			
			
			if(userAgent.contains("Trident")) {// Trident : IE version 11
				logger.info("IE browser");
				downloadName = URLEncoder.encode(resourceName, "utf-8").replaceAll("\\+", " ");
			} else if(userAgent.contains("Edge")) {// Edge
				logger.info("Edge browser");
				downloadName = URLEncoder.encode(resourceName, "utf-8");
			} else {
				logger.info("Chrome browser");
				downloadName = new String(resourceName.getBytes("utf-8"), "ISO-8859-1");
			}
			
			// 첫번째 파라미터 Content-disposition : 다운로드 시 저장되는 이름
			// 두번째 파라미터 attachment;filename= : 한글일 경우 utf-8로 인코딩 해주기 위해서 잡아줌
			headers.add("Content-disposition", "attachment;filename=" + downloadName);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		// ressource : 첨부파일 객체
		// headers : 파일명 처리 정보
		return new ResponseEntity<Resource>(resource, headers, HttpStatus.OK);
	}

'Back-end > Spring' 카테고리의 다른 글

IoC, DI, 컨테이너  (0) 2022.02.07
스프링이란?  (0) 2022.02.04

+ Recent posts