[Spring] @JsonProperty / @SerializedName
보호되어 있는 글입니다.
2024.04.23
[Spring] Failed to instantiate [java.util.List]: Specified class is an interface
보호되어 있는 글입니다.
2024.04.14
no image
[Spring] 스프링 입문 #4 스프링 빈과 의존관계
스프링 빈을 등록하고, 의존관계 설정하기 회원 컨트롤러에 의존관계 추가 package hello.hellospring.web; import hello.hellospring.service.MemberService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @Controller public class MemberController{ private final MemberService memberService; @Autowired public MemberController(MemberService memberService){ this.memberServ..
2023.12.14
no image
[Spring] 스프링 입문 #1 프로젝트 환경설정 & 스프링 웹 개발 기초
프로젝트 생성 ▶️ 사전 준비물 Java 11 17 설치 IDE : IntelliJ 또는 Eclipse 설치 " 스프링 부트 스타터 사이트로 이동해서 스프링 프로젝트 생성" https://start.spring.io/ 라이브러리 살펴보기 Gradle은 의존관계가 있는 라이브러리를 함께 다운로드 한다. ▶️ 스프링 부트 라이브러리 spring-boot-starter-web spring-boot-starter-tomcat : 톰캣(웹서버) spring-webmvc : 스프링 웹 MVC spring-boot-starter-thymeleaf : 타임리프 템플릿 엔진(View) spring-boot-starter(공통) : 스프링 부트 + 스프링 코어 + 로깅 spring-boot : spring-core spr..
2023.12.12

[Spring] @JsonProperty / @SerializedName

2024. 4. 23. 10:11

This is a protected article. Please enter the password.

[Spring] Failed to instantiate [java.util.List]: Specified class is an interface

2024. 4. 14. 13:04

This is a protected article. Please enter the password.

스프링 빈을 등록하고, 의존관계 설정하기

회원 컨트롤러에 의존관계 추가

package hello.hellospring.web;

import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class MemberController{
        private final MemberService memberService;

        @Autowired
        public MemberController(MemberService memberService){
                this.memberService = memberService;
        }
}
  • 생성자에 @Autowired가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다. 이렇게 객체 의존 관계를 외부에서 넣어주는 것을 DI (Dependency Injection), 의존성 주입이라 한다.
  • 이전 테스트에서는 개발자가 직접 주입했고, 여기서는 @Autowired에 의해 스프링이 주입해준다.

 

오류 발생) memberService가 스프링 빈으로 등록되어 있지 않다.

 

스프링 빈을 등록하는 2가지 방법

  • 컨포넌트 스캔과 자동 의존관계 설정
  • 자바 코드로 직접 스프링 빈 등록하기
스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다. (유일하게 하나만 등록해서 공유한다.) 따라서 같은 스프링 빈이면 모두 같은 인스턴스다. 설정으로 싱글톤이 아니게 설정할 수 있지만, 특별한 경우를 제외하면 대부분 싱글톤을 사용한다.

 

컴포넌트 스캔과 자동 의존관계 설정

  • @Component 애노테이션이 있으면 스프링 빈으로 자동 등록된다.
  • @Controller 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문이다.
  • @Component를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록된다.
    • @Controller
    • @Service
    • @Repository

 

자바 코드로 직접 스프링 빈 등록하기

DI에는 필드 주입, setter 주입, 생성자 주입 이렇게 3가지 방법이 있다. 의존관계가 실행중에 동적으로 변하는 경우는 거의 없으므로 생성자 주입을 권장한다.

728x90

프로젝트 생성

▶️ 사전 준비물 

  • Java 11 17 설치
  • IDE : IntelliJ 또는 Eclipse 설치

" 스프링 부트 스타터 사이트로 이동해서 스프링 프로젝트 생성"

https://start.spring.io/

 

라이브러리 살펴보기

Gradle은 의존관계가 있는 라이브러리를 함께 다운로드 한다.

 

▶️ 스프링 부트 라이브러리

spring-boot-starter-web

  • spring-boot-starter-tomcat : 톰캣(웹서버)
  • spring-webmvc : 스프링 웹 MVC

spring-boot-starter-thymeleaf : 타임리프 템플릿 엔진(View)

spring-boot-starter(공통) : 스프링 부트 + 스프링 코어 + 로깅

  • spring-boot : spring-core
  • spring-boot-starter-logging : logback, slf4j

 

▶️ 테스트 라이브러리

spring-boot-starter-test

  • junit : 테스트 프레임워크
  • mockito : 목 라이브러리
  • assertj : 테스트 코드를 좀 더 편하게 작성하게 도와주는 라이브러리
  • spring-test : 스프링 통합 테스트 지원

 

View 환경설정

package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {

    @GetMapping("hello")
    public String hello(Model model){
        model.addAttribute("data", "hello!!");
        return "hello";
    }
}
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Hello</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="'안녕하세요. ' +${data}" >안녕하세요. 손님</p>
</body>
</html>

컨트롤러에서 리턴 값으로 문자를 반환하면 뷰 리졸버 (viewResolver)가 화면을 찾아서 처리한다.

  • 스프링 부트 템플릿엔진 기본 viewName 매핑
  • 'resources:templates/' + (ViewName) + '.html'

 

API

@ResponseBody 사용 원리

@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name){
    return "hello " + name;
}

  • HTTP의 BODY에 문자 내용을 직접 반환
  • 'viewResolver' 대신에 'HttpMessageConverter'가 동작
  • 기본 문자처리 : StringHttpMessageConverter
  • 기본 객체처리 : MappingJackson2HttpMessageConverter
  • byte 처리 등등 기타 여러 HttpMessageConverter가 기본을 등록되어 있음

 

728x90