<TIL> 36. spring

YUJIN LEE·2023년 2월 28일
0

개발log

목록 보기
31/149

@SpringBootApplication
-> 우리가 아무런 설정을 안해줘도 스프링에 필요한 디폴트 설정들을 다 설정해줌

public static void main(String[] args) {
        SpringApplication.run(SpringIocDiFinApplication.class, args);
    }

SpringApplication.run 을 통해 서버가 실행된다!

3계층으로 분리
controller - 요청에 대한 처리와 반환, 즉 입구이자 출구!
service - 로직
repository - 데이터베이스와의 연결을 해서 저장을 하는 곳

@PostMapping -> http 메서드 중 Post 메서드로 요청을 받음
@PostMapping("/saveOrder/{amount}")
-> 수량같은걸 받을때 MVC 패턴때 배운 이 PathVariable 방식으로 받을 수 있다.
@PathVariable -> URL 경로에 변수를 넣어주는 것!

@Autowired -> 의존관계 주입(DI)을 할 때 사용하는 어노테이션(Annotation), IoC컨테이너에 존재하는 빈(Bean)을 찾아 주입하는 역할
Spring 컨테이너가 관리하는 Bean에서만 사용이 가능하다.

  • Bean을 매칭하는 방법
  1. 타입매칭 - 같은 타입이거나 그 타입의 자식들을 다 가져옴)
  2. 타입 매칭의 결과가 2개 이상인 경우 필드명 or 파라미터명으로 빈 이름을 매칭하여 주입

Bean
특정한 정보 등을 가지고 있는 클래스를 표현하는 하나의 규칙, 데이터를 표현하기 위한 목적.
약속

  • 반드시 클래스는 패키지화 되어야 함
  • 멤버변수는 property
  • 멤버변수는 private로 지정, 외부접근을 위한 get, set 메소드 정의
  • get, set 메소드는 public 지정

우리가 직접 클래스를 만들지 않아도 스프링이 자동으로 만들어서 가지고있는
관리하는 객체를 'bean'이라고 부른다.
그 클래스를 빈으로 등록하기 위해 컨트롤러나 서비스와 같은 어노테이션을 클래스 위에 추가!
그 빈들을 관리하고 넣어주는 역할은 IoC 컨테이너!
IoC컨테이너에 우리가 등록한 빈들이 들어가 있고,
스프링 내부에서 써야하는 빈들도 자동으로 등록되어있음.
필요한 곳에 주입을 해줘야하는데 그 주입은 @Autowired 를 통해 주입!

다시한번 정리.
빈이랑 스프링이 관리하는 클래스.
@Autowired 우리가 주입을 하기 위해 주입을 해달라고 스프링에게 알려주는 어노테이션
Autowired를 통해 주입할 수 있는 객체는 꼭 빈이어야한다!
우리가 빈으로 등록하러면 이런 컨트롤러 어노테이션이나 서비스 어노테이션을 클래스 위에 등록해야함!!

@Getter - 우리 눈에 보이지 않지만 getter가 생성된다.

단축키
.var - 받아지는 변수가 자동으로 생성

@RequestMapping - 우리는 특정 url로 요청을 보내면 Controller에서 어떠한 방식으로 처리할지 정의. 이때 들어온 요청을 특정 메서드와 매핑
url의 맨 앞으로감!
중복오류방지

@Primary - 구현체가 중복이 될 때 헷갈리지 말고 무조건 이 어노테이션이 있는 구현체를 넣으라고 소프트웨어에게 알려줌

@@Qualifier("이름") - 이름과 똑같은 부분에 찾아가서 넣어준다.
controller와 service를 이름을 통해 연결

@NoArgsConstructor - NoArgs 즉, 파라미터가 없는 기본 생성자.
따로 기본 생성자를 만들지 않아도 기본생성자가 만들어져있다.

@RequiredArgsConstructor - 우리가 주입을 할 때 @Autowired를 했는데 lombok이라는걸 사용하면 @Autowired를 지울 수 있다.
이 어노테이션을 달고 생성자부분을 지워주면 오류없이 잘 실행된다!!
우리가 직접 생성자를 만들지 않아도, 자동으로 final이 달려있는 필드들을 찾아서 만들어준다!!
=> 생성자 주입 어노테이션
final이 붙거나 @NotNull 이 붙은 필드의 생성자를 자동 생성해주는 롬복 어노테이션

@EnableJpaAuditing - 생성일자와 수정일자를 자동으로 등록

Model 객체 사용법

Model 객체를 파라미터로 받아 데이터를 뷰로 넘길 수 있다.

@RequestMapping("/view")
public String view(Model model){
	// 데이터만 설정 가능
    model.addArrtibute("id", "yujin");
    
    return "/view";
model.addAttribute("변수이름", "변수에 넣을 데이터값");

위를 사용해, 넘길 데이터의 이름과 값을 넣는다.
그러면 스프링을 그 값을 뷰쪽으로 넘겨준다.

${변수이름} -> 뷰(.jsp)파일에서는 이런식으로 값을 가져온다.

${id} -> yujin

ModelAndView 객체 사용법

@RequestMapping("/view")
public ModelAndView content(){
	
    // 데이터와 뷰를 동시 설정 가능
    ModelAndView mv = new ModelAndView();
    mv.setViewName("/view"); // view 이름
    mv.addObject("data", "23"); // view로 보낼 데이터 값
    
    return mv;

반환값으로 ModelAndView 객체 반환
ModelAndView 객체를 선언 및 생성

뷰의 이름을 설정시
setViewName() 메소드 이용

mv.setViewName("뷰의 경로");

데이터를 보낼땐
addObject() 메소드 이용

mv.addObject("변수 이름", "데이터 값")

jsp도 똑같이 ${} 이용


클라이언트에서 서버로 통신하는 메시지를 요청(request)메시지라 하며, 서버에서 클라이언트로 통신하는 메시지를 응답(response)메시지라 한다.
웹에서 화면전환(새로고침)없이 이루어지는 동작은 대부분 비동기 통신
비동기통신을 위해서는 클라이언트에서 서버로 요청을 보낼 때, 본문에 데이터를 담아 보내야하고, 서버에서 클라이언트로 응답 보낼때도 본문에 데이터를 담아 보내야함

이 본문이 body.
요청 본문 requestBody, 응답본문 responseBody

이때 본문에 담기는 데이터 형식 중 가장 대표적으로 사용되는 JSON으로 보낸다.
즉, 비동기식 클라-서버 통신을 위해 JSON 형식의 데이터를 주고받는 것.

@RequestBody, @ResponseBody는 각각 Http요청 바디를 자바 객체로 변환하고 자바 객체를 다시 HTTP 응답바디로 변환

@RequestBody - 이 어노테이션이 붙은 파라미터에는 http요청의 본문(body)이 그대로 전달
@ResponseBody - 자바객체를 HTTP요청의 바디 대용으로 매핑해 클라로 전송
즉, http요청body를 자바 객체로 전달받을 수 있다.

즉!
클라이언트에서 서버로 필요한 데이터를 요청하기위해 JSON 데이터를 요청 본문에 담아 서버로 보내면, 서버에서는 @RequestBody 어노테이션을 사용해 HTTP 요청 본문에 담긴 값들을 자바객체로 변환시켜, 객체에 저장
서버에서 클라이언트로 응답 데이터를 전송하기 위해 @ResponseBody 어노테이션을 사용해 자바 객체를 HTTP 응답 본문의 객체로 변환해 클라로 전송

@Transactional

트랜잭션(Transaction)?
우리말로 거래. 라는 뜻

모든 작업들이 성공적으로 완료되어야 작업 묶음의 결과를 적용,
어떤 작업에서 오류가 발생시 이전에 있던 모든 작업들이 성공적이었더라도 없던 일처럼 완전히 되돌리는 것.
DB를 다룰 때 트랜잭션을 적용하면 데이터 추가, 갱신, 삭제 등으로 이루어진 작업을 처리하던 중 오류가 발생시 모든 작업을 원상태로 돌릴 수 있다..

@Transactional

  • DB와 관련된, 트랜잭션이 필요한 서비스 클래스 or 메서드에 이 어노테이션을 달아준다.
    이 어노테이션이 붙은 메서드는 메서드가 포함하고 있는 작업 중 하나라도 실패할 경우 전체 작업을 취소한다!

@PathVariable - URL 변수.

Request param, query, body 차이점

  1. req.param
    주소에 포함된 변수를 담는다. 예를 들어 https://okky.com/post/12345 라는 주소가 있다면 12345를 담는다

  2. req.query
    주소 바깥, ? 이후의 변수를 담는다. 예를 들어 https://okky.com/post?q=Node.js 일 경우 Node.js를 담는다

  3. req.body
    XML, JSON, Multi Form 등의 데이터를 담는다. 당연히 주소에선 확인할 수 없다.

profile
인정받는 개발자가 되고싶습니다.

0개의 댓글