Develope Story

2019-08-09 [Spring-study] QnA 1단계 - DB 없이 질문 기능

|

QnA 1단계 - DB 없이 질문 기능

공부한 내용

GET, POST 사용 기준

  • Get
    • Selcet 적인 성향
    • 서버에서 어떤 데이터를 가져와 보여줌 (서버의 값이나 상태를 바꾸지 않음)
  • Post
    • 서버의 값이나 상태를 바꾸기 위해서 사용
    • DB 저장이나 수정

HTTP 상태 코드

status code 단위별 의미

  • 2XX : 성공. 클라이언트가 요청한 동작을 수신하여 이해했고 승낙했으며 성공적으로 처리
  • 3XX : 라다이렉션 완료. 클라이언트는 요청을 마치기 위해 추가 동작이 필요함.
  • 4XX : 요청 오류. 클라이언트에 오류가 있음
  • 5XX : 서버 오류. 서버가 유효한 요청을 명백하게 수행하지 못했음

위키백과 - https://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C

VO 와 DTO 차이

VO

  • 데이터 그 자체로 의미 있는 것을 담고 있는 객체(read only)
    • 사용 되는 값이 객체로 표현 되며, 값 변경이 없는 경우를 말함

DTO

  • 전송되는 데이터의 컨테이너
    • 데이터의 전송을 위한 객체이며, 비지니스 로직까지 담아서 사용함

@AutoWired 란

  • Bean을 자동으로 주입해준다. (DI)
  • 같은 타입이 여러개일 때 -> @Qualifier() 이용
  • 혁진이형 리뷰 참고

Lombok

공식 문서 https://projectlombok.org/features/all>

어노테이션 기반으로 Getter, Setter ToString 등을 자동으로 생성해 주는 라이브러리

사용법

  • intelliJ plugin 에서 lombok 추가

  • dependency 추가

    <dependency>
    	<groupId>org.projectlombok</groupId>
    	<artifactId>lombok</artifactId>
    	<version>1.16.20</version>
    </dependency>
    

PUTMapping

html form 태그는 POST, GET 요청 밖에 안됨.

  • put, delete 를 사용하기 위해서는 <input type="hidden", name="_method", vlaue="put"> 추가

리뷰 받은 내용

혁진이형

  • Autowired 를 사용하지 않고 구현해보도록 한다

    • 처음에 Autowired 를 사용하지 말라고 한 의도는 다음과 같습니다.

      인강 들어서 아시겠지만 스프링에서 의존성 주입(DI)하는 방식으로 필드 주입, 생성자 주입, 세터 주입이 있습니다. 이 중에서 필드 주입으로 Autowired 를 많이들 사용하는데요, Spring 팀에서도 이제는 필드주입 자체를 지양하라고 명시하고 있습니다.

      애초에 필드만 가지고 객체를 주입하기 위해서는 java reflection을 사용해서 억지로 필드에 접근해서 객체를 할당해야합니다. (생성자, setter 없이 어떻게 객체가 할당될 수 있는지 생각해보시면 좋을 것 같네요) 이것은 POJO(순수한 자바 오브젝트)를 통해 개발을 할 수 있도록 지향하는 스프링의 프레임워크 철학에 위배되는 사항입니다. 또한 정상적인 방법으로 주입을 받지 않기 때문에 단위테스트가 어렵습니다. 그리고 리플렉션은 비용이 큽니다

      https://blog.marcnuri.com/field-injection-is-not-recommended/

      참고 글입니다.

      UserService나 UserDao 나 스프링 컴포넌트들은 모두 Bean으로 관리되는 싱글턴 패턴입니다. DI를 통한 의존성 주입 방식을 사용하는데요,

      @Autowired
      UserService(UserDao userdao){
      	this.userdao = userdao
      }
      

      이렇게 적어주면 자동으로 의존성 주입이 되었는데, 스프링 4.x 버전인가 3.x 버전부터는 Autowired 를 제거하고

      UserService(UserDao userdao){
      	this.userdao = userdao
      }
      

      이렇게 생성자만 적어주는 것만으로도 자동으로 의존성 주입이 가능해졌습니다.

      한마디로 결론은 Autowired 를 통한 필드 주입을 지양하고 생성자 주입을 사용하자 입니다. 필드 주입 대신 생성자 주입을 사용하는 이유

      @resource@Inject 같은 경우는 스프링에서 Autowired 기능을 추가했을 때 자바 진영에서 만든 애너테이션들입니다. 결국 Autowired를 따라한 것인데요, 이것들도 사용을 지양하는 것이 좋습니다.

  • update 동사를 지우고 @PutMapping으로 구현해보자

  • 로직이 컨트롤러에 노출되어 있음. 로직을 최소화시키자

  • lombok를 사용하여 getter setter 처리하자

  • get의 사용을 줄여보자.

Comments