12월 7일 - 수업 33일차 (SPRING)

수아레스·2022년 12월 11일
post-thumbnail

1. 아래의 쿼리문을 완성하시오.

--JOB 중복제거
SELECT DISTINCT JOB FROM EMP;

--급여가 2850이상인 사원의 이름 및 급여
SELECT ENAME, SAL FROM EMP WHERE SAL >= 2850;

--사원번호가 7566인 사원의 이름 및 부서번호
SELECT ENAME, DEPTNO FROM EMP WHERE EMPNO = 7566;

--급여가 1500이상 2850이하의 범위에 속하지 않는 모든 사원의 이름 및 급여
SELECT ENAME, SAL FROM EMP WHERE SAL NOT BETWEEN 1500 AND 2850;

--1981년 2월 20일 ~ 1981년 5월 1일에 입사한 사원의 이름,직업 및 입사일을 기준으로 오름차순
SELECT ENAME, JOB, HIREDATE FROM EMP WHERE HIREDATE
BETWEEN '1981/02/20' AND '1981/05/01'ORDER BY HIREDATE;

2. commit과 rollback에 대하여 설명하시오.

COMMIT

보류중인 모든 데이터 변경사항을 영구적으로 적용. 현재 트랜잭션 종료

ROLLBACK

보류중인 모든 데이터 변경사항을 폐기. 현재 트랜잭션 종료, 직전 커밋 직후의 단계로 회귀 (되돌아가기)

3. 스프링 legacy와 스프링 부트의 차이는?

  • Spring Starter Project : Spring Boot를 이용하는 프로젝트
  • Spring Legacy Project : 스프링 템플릿 프로젝트를 이용하는 프로젝트

Spring Boot : Spring Starter Project

  • 최대한 간단하게 실행하고, 배포가 가능한 수준의 웹 어플리케이션을 제작하는 것이 목적
  • 개발에 필요한 모든 환경 설정을 맞춰주고, 최소한의 개발을 해야 하는 경우 사용
  • 개발자가 복잡한 설정 없이 모든 개발 환경이 준비되기 때문에 초보 개발자도 쉽게 웹 프로젝트를 만들 수 있다.
  • 별도의 WAS 설정 없이도 실행이 가능하다.
  • 해당 방식보다는 Legacy Project를 실제 개발 업무에서 많이 사용한다.

Spring Legacy Project

  • AWS를 사용하거나, 모델2 방식에 대한 이해가 있다면 해당 프로젝트를 사용하는 것이 좋다.
  • 실제 개발 업무에서 많이 사용하는 방식이다.
  • AWS 또는 기타 설정을 직접 해야 하기 때문에 초기 세팅에 대한 공부가 필요하다.

출처: https://developsd.tistory.com/68

4. 스프링 부트로 hello world를 출력하시오.

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {

	@GetMapping("/")
	public String hello() {
		return "Hello World";
	}
}


<매핑을 통해 Controller가 특정 View를 사용자에게 반환>

  1. Client가 웹 서비스에 요청을 보내면 Dispatcher Servlet이 매핑되는 Handler를 찾는다.
  2. Controller가 요청을 처리한 후에 View를 Dispatcher Servlet에게 전달해주고 다시 사용자에게 응답한다.
  3. Controller가 View를 반환하기 위해서는 ViewResolver가 사용되며, ViewResolver 설정에 맞게 View를 찾아 렌더링한다.

cf. @GetMapping

@Controller
public class HelloController {

    @GetMapping("hello")
    public String hello(){
        return "hello";
    }
}

HelloController를 새로 만들어주고 어노테이션을 통해 controller임을 명시해준다.
@GetMapping("hello") -> localhost:8080/hello 요청이 들어오면 아래의 함수를 실행
String으로 hello를 리턴 -> Spring이 자동으로 src/main/resouces의 templates에서 hello라는 이름의 View를 찾아서 반환

<!DOCTYPE HTML>
<html>
    <head>
        <title>Hello</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    </head>
    <body>
    Hello
    </body>
</html>

hello.html에 간단한 문장을 찍으면 브라우저에서 localhost:8080/hello 에 접속했을때 페이지가 뜨는 것을 확인할 수 있다.

출처: https://coding-nyan.tistory.com/71


cf. @Controller

전통적인 Spring MVC의 컨트롤러인 @Controller는 주로 View를 반환하기 위해 사용한다. 아래와 같은 과정을 통해 Spring MVC Container는 Client의 요청으로부터 View를 반환한다.

1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
2. DispatcherServlet이 요청을 위임할 HandlerMapping을 찾는다.
3. HandlerMapping을 통해 요청을 Controller로 위임한다.
4. Controller는 요청을 처리한 후에 ViewName을 반환한다.
5. DispatcherServlet은 ViewResolver를 통해 ViewName에 해당하는 View를 찾아 사용자에게 반환한다.

Controller로 Data 반환하기

컨트롤러에서는 데이터를 반환하기 위해 @ResponseBody 어노테이션을 활용한다.
이를 통해 Controller도 Json 형태로 데이터를 반환할 수 있다.


1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
2. DispatcherServlet이 요청을 위임할 HandlerMapping을 찾는다.
3. HandlerMapping을 통해 요청을 Controller로 위임한다.
4. Controller는 요청을 처리한 후에 객체를 반환한다.
5. 반환되는 객체는 Json으로 Serialize되어 사용자에게 반환된다.

컨트롤러를 통해 객체를 반환할 때에는 일반적으로 ResponseEntity로 감싸서 반환한다. 그리고 객체를 반환하기 위해서는 viewResolver 대신에 HttpMessageConverter가 동작한다.

@Controller
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    @GetMapping(value = "/users")
    public @ResponseBody ResponseEntity<User> findUser(@RequestParam("userName") String userName){
        return ResponseEntity.ok(userService.findUser(user));
    }
    
    @GetMapping(value = "/users/detailView")
    public String detailView(Model model, @RequestParam("userName") String userName){
        User user = userService.findUser(userName);
        model.addAttribute("user", user);
        return "/users/detailView";
    }
}

findUser는 User 객체를 ResponseEntity로 감싸서 반환하고 있고, User를 json으로 반환하기 위해 @ResponseBody라는 어노테이션을 붙여준다.

detailView 함수에서는 View를 전달해주고 있기 때문에 String을 반환값으로 설정해준다.


@RestController

@RestController는 @Controller에 @ResponseBody가 추가된 것이며, 주용도는 Json 형태로 객체 데이터를 반환하는 것이다.

최근에 데이터를 응답으로 제공하는 REST API를 개발할 때 주로 사용하며 객체를 ResponseEntity로 감싸서 반환한다. 이러한 이유로 동작 과정 역시 @Controller에 @ReponseBody를 붙인 것과 완벽히 동일하다.

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

@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    @GetMapping(value = "/users")
    public User findUser(@RequestParam("userName") String userName){
        return userService.findUser(user);
    }

    @GetMapping(value = "/users")
    public ResponseEntity<User> findUserWithResponseEntity(@RequestParam("userName") String userName){
        return ResponseEntity.ok(userService.findUser(user));
    }
}

findUser는 User 객체를 그대로 반환하고 있다. 이러한 경우의 문제는 클라이언트가 예상하는 HttpStatus를 설정해줄 수 없다는 것이다. 예를 들어 어떤 객체의 생성 요청이라면 201 CREATED를 기대하지만 객체를 그대로 반환하면 HttpStatus를 설정해줄 수 없다. 그래서 객체를 상황에 맞는 ResponseEntity로 감싸서 반환해주어야 한다.

출처: https://mangkyu.tistory.com/49

profile
띵호와

0개의 댓글