Hello-Spring

suesue lee·2022년 1월 26일
0

SPRING

목록 보기
1/4
post-thumbnail

Hello-Spring

"김영한의 스프링 입문" 강의를 보며 생성한 아카이브


정적 HTML

모든 사용자에게 동일한 정보를 제공하는 정적 (static) 콘텐츠이다.

  • 정적 HTML 파일은 /resource/static 에 생성한다.

템플릿 엔진

요청(Request)에 대한 처리 결과를 포함하여, 사용자 별로 다른 결과를 제공하기 위해 템플릿 엔진 (Template Engine) 을 사용하여 동적 컨텐츠를 생성할 수 있다.

  • 템플릿 HTML 파일은 /resource/template/ 에 생성한다.

Thymeleaf

템플릿 엔진 종류 중 하나로 이 repository에서는 Tymleaf 템플릿 엔진을 사용한다.

  • HTML (View) 상단에 <html lang="ko" xmlns:th="http://thymeleaf.org"> 를 추가하여 Tymleaf 사용을 알린다.

  • Controller 임을 명시하기 위해서 @Controller annotation 추가한다.

  • Controller 에서 리턴 값으로 반환한 문자를 통해 viewResloverView 를 찾아서 처리해준다.


    Controller

    // HelloController.java

          @Controller
          public class HelloController {
    
              @GetMapping("/hello") 
              public String hello(Model model) {
    
                  model.addAttribute("name", "ahakim");
                  return "hello"; 
              }
          }

  • GetMapping() : 사용자가 요청하는 URL 을 지정한다.

  • model.addAttribute() : View 에 전달할 데이터 추가

  • 리턴 값 "hello"를 통해 viewResolver/resource/template/hello.html 을 찾는다.


    View

    // hello.html
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1 th:text="${name}">Name</h1>
</body>
  • th:text="${name}" : Controller 에서 받은 데이터를 사용한다.

@ResponseBody

ResponseBody annotation을 사용하는 경우 viewResolver 대신 HttpMessageConverter 를 통해 HHTP Body 에 문자 내용을 직접 반환한다.

  • StringHttpMessageConverter : 문자열
  • MappingJackson2HttpMessageConverter : 객체 → JSON


    • Jackson2(version2) = 객체를 JSON 으로 바꾸어 주는 library(Jackson, Gson(google) 이다.
    • Spring은 Jackson 을 기본적으로 탑재하고 있다. 사용의 이유는 범용성과 인증된 library 이기 때문이다.

      기본 객체 처리 'MappingJackson2HttpMessageConverter'가 JSON으로 자동 변경 해주고, JSON 은 http의 body에 넣어주어 강의에서 예제로 나온 (name:spring) 으로 요청해주는 웹브라우저 / 맵브라우저 / 안드로이드 클라이언트 / another server 에 반환을 해준다.

문자열

@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam(value = "name", required = false) String name, Model model){
    model.addAttribute("name", name);
    return "hello "+name; 
}

객체

JSON 형태로 반환

@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name, Model model){
   Hello hello = new Hello();
   hello.setName(name);
   return hello;
}

static class Hello{
   private String name;

   public String getName() { return name; }
   public void setName(String name) { this.name = name; }
}

스프링 빈과 의존관계

스프링 빈 (Spring Bean)

스프링 컨테이너(Spring Container) 가 관리하는 자바 객체

  • 일반적으로 new 키워드를 통해 인스턴스화하는 객체와 다르게, 컨테이너의 관리를 통해 객체를 여러번 생성할 필요 없이 공용으로 사용 가능하다.

의존관계 설정

  1. 컴포넌트 스캔
    @Service, @Repository, @Controller annotation이 있으면 스프링 빈에 자동 등록된다.
@Controller
public class MemberController  { ... }

@Service
public class MemberService  { ... }

@Repository //interface의 구현체에만 어노테이션 추가
public interface MemoryMemberRepository implements MemberRepository { ... }

@Autowired
스프링이 관리 하는 객체, 스프링 빈으로 등록하지 않고 본인이 직접 생성한 객체에서는 동작하지 않음

  1. Field (필드)

    @Controller 
    public class MemberController {
    	@Autowired private final MemberService memberService;
    }
  2. Setter

    @Controller
    public class MemberController {
      private final MemberService memberService;
    
      @Autowired
      public void setMemberService(MemberService memberService){
        this.memberService = memberService;
      }
    }
  3. Constructor (생성자)
    객체가 생성되는 시점에 빈을 주입 → 의존성이 주입되지 않아 발생할 수 있는 NullPointException 방지

@Controller
public class MemberController {
  private final MemberService memberService;
  
  @Autowired
  public MemberController(MemberService memberService) {
    this.memberService = memberService;
  }
}

  1. 자바 코드로 직접 스프링 빈 등록
  • MemberService, MemoryMemberRepository 의 @Service, @Repository, @Autowired annotation 제거

  • Configuration 파일을 생성하여 직접 등록

    @Configuration
    public class SpringConfig {
    
       @Bean
       public MemberService memberService(){
           return new MemberService(memberRepository());
       }
    
       @Bean
       public MemberRepository memberRepository(){
           return new MemoryMemberRepository();
       }
    }

    메모

  • Optional (Java 8)
    null 이 될 수도 있는 객체를 감싸고 있는 일종의 Wrapper Class 이다.

profile
미래의 웹프로그래머

0개의 댓글