2018. 7. 27.

[간단번역] Top 20 REST and Spring MVC Interview Questions for Java Developers - Javin Paul

Javin Paul(LinkedIn, Javarevisited, JAVA67)은 프로그래머면서 블로거인데, 자바나 스프링과 관련돼서 저도 가끔 들어가는 블로그의 주인장입니다. 특히 저 JAVA67 사이트는 자바와 관련된 기술적인 다양한 글들이 있어서 몇 번 도움을 받았던 부분이 있었습니다.

이번에 Javin Paul이 Top 20 REST and Spring MVC Interview Questions for Java Developers라는 제목으로 DZone에 글이 하나 올라왔는데 꽤 간단히 정리를 잘했더군요. 초보 개발자나 중급 개발자 정도의 레벨에서 주로 할만한 질문들을 정리해 놓은 글들인데, 일단 제가 볼 때는 3년 이하의 개발자들이 한 번쯤 정리하고 지나간다 생각하고 볼만한 글로 보입니다. 진짜 못하는 영어이지만 간단히 번역해서 소개해 봅니다. 번역은 그냥 반말 대화체로 진행합니다. 말투나 의역이 거슬리더라도 이해 바랍니다.

20개의 질문이라더니 실제로는 22개네요. 정말 번역하시는 분들 존경합니다. 이리 힘든 일을...

원문 : Top 20 REST and Spring MVC Interview Questions for Java Developers - Javin Paul (DZone)

안녕 친구들! 최근 몇 개월 동안 그리고 오늘까지 REST와 Spring 강좌를 나눠왔는데, 자바 웹 개발자를 지원했을 때 자주 받게 되는 Spring MVC와 REST에 대한 질문들을 나눠볼까 해.

자바 웹 프로그램과 RESTful Web Service를 개발하면서 Springframework는 가장 보편적이고 표준적인 프레임워크이기 때문에, Senior 자바 개발자에게는 Spring Core와 Spring MVC에 대한 충분한 지식이 필요해. 그러나 작업 명세에 REST와 Web Service가 명시되어있다면, 스프링을 이용해서 RESTful web service를 어떻게 개발할 것인가 하는 것도 알아야 해.

Spring 3.1 이후로 Springframework는 RESTFul API를 지원하기 위한 많은 기능을 향상해 왔지. HTTPMessageConverter는 Jackson이나 JAXB 같은 관련 라이브러리를 감지해서 Http응답을 JSON 또는 XML로 변환할 수 있어.

Spring은 또한 @RestController 같은 사용자 정의 어노테이션을 제공함으로써 REST Controller를 좀 더 명확하게 해주고, 모든 REST API에서 필요한 JSON으로의 응답변환 같은 작업을 수행할 필요없게 해주지.

실제 RESTful web service를 개발할때는 Spring security에 대한 충분한 지식도 필수적이야. 보안 없이 중요한 API를 개발하는 것은 불가능하기 때문에, security의 기본과 HTTP basic authentication, digest authentication, OAuth, 그리고 JWT에 대한 충분한 지식은 매우 중요해.

20가지의 Spring REST Web Service에 대한 면접 질문


1. REST는 무엇을 의미하는가?


REST는 REpresentational State Transfer의 약자로, client에서 server로 데이터를 보내기 위해 HTTP 프로토콜을 이용해. 즉, 서버는 예약정보를 JSON 또는 XML을 이용해서 client에게 보낼 수 있는 거지. 그러나 만약 REST에 익숙하지 않다면, 좀 더 잘 이해하기 위해서 우선은 REST API 설계와 개발(REST API design and development)에 대해서 공부하는 것을 추천해. (여기서 온라인 강좌의 링크가 있습니다만, 최근 책이나 온라인에 정리 잘하신 분들이 많으니 다른 방법을 이용하시길 저는 추천합니다. -역자주^^)


2. Resource는 무엇인가?


Resource는 REST 아키텍처에서 데이터가 표현되는 방식을 말해. Entity를 Resource로 노출함으로써 Client가 GET, POST, PUT, DELETE 등의 Http Method를 통해 읽고 쓰고 수정하고 생성하는 것이 가능하지. (쓰는것과 생성하는 게 뭐가 다를까요? 아마도 삭제를 이야기하고 싶었던 것 같습니다. - 역자주)


3. 안전한(Safe) REST 작업(Operations)이란 무엇인가?


REST API는 작업을 수행하기 위해서 HTTP Method를 이용하게 돼. 몇몇 HTTP 작업은 서버의 자원을 수정하지 않는데, 이러한 작업을 안전한 작업이라고 하지. 이러한 작업에는 GET과 HEAD가 널리 알려져 있어. 반면에, PUT, POST, DELETE는 서버의 자원을 수정할 수 있기 때문에 안전하지 않은 작업이라 하지.


4. 멱등한(idempotent) 작업은 무엇인가? 멱등성(idempotency)은 왜 중요한가?


GET 같은 몇몇 HTTP Method들은 몇 번을 사용하더라도 같은 응답을 생성하는데, 같은 URI에 여러 번 GET 요청을 한다고 해도 다른 영향 없이 같은 응답을 받게 되지. 그래서 이런 경우를 멱등하다고 해.

반면에 POST 같은 경우는 서버에 여러 번의 POST 요청을 하면 여러 개의 자원(Resource)이 서버에 생성되기 때문에 멱등하지 않다고 하지. 만약, PUT을 자원을 업데이트하는 용도로 사용한다면 PUT은 멱등한거야.

여러 번 PUT 요청을 하고 서버가 자원을 여러 번 UPDATE 했다고 해도 결과적으로 받는 자원은 같은 결과인 거지. -- 강좌 소개라 이후는 생략합니다. --


5. REST는 확장성 및(또는 과) 상호운용성이 있나?


맞아. REST는 확장 가능하고 상호운용적이야. 클라이언트와 서버 어느 쪽이건 특정 기술에 대한 선택이 필수적이지 않지. RESTful web service를 서버에 만들거나 클라이언트에서 그것을 이용하기 위해 Java, C++, Python 또는 Javascript를 사용할 수도 있어. REST에 대해 좀 더 공부하려면, RESTful Web Services 같은 잘 정리된 책을 보는 것을 추천해. (링크에는 5권의 책이 소개되어있는데, 번역서는 아쉽게도 없는 책들인 거 같습니다. - 역자주)


6. RestTemplate의 장점은 무엇인가? (Answer)


RestTemplate 클래스는 Springframwork의 Template Method Pattern의 구현체야. JdbcTempate이나 JmsTemplate 같은 유명한 Template 클래스와 비슷하게 client가 RESTful web service와 상호작용을 간단하게 해주지. RestTemplate 예제(위 Answer 링크 - 역자주)에서 보는 것과 같이 RESTful web service를 쉽게 이용할 수 있지.


7. REST는 어떤 HTTP Method를 이용하나?


REST는 어떤 HTTP Method건 이용할 수 있어. 다만, 자원 조회를 위한 GET, 자원 생성을 위한 POST, 자원 수정을 위한 PUT, 자원을 삭제하기 위한 DELETE가 유명한 것들이지.


8. Spring REST에서 HttpMessageConverter는 무엇인가?


HttpMessageConverter는 HTTP 요청과 응답에 대해서 양방으로 변환하기 위한 변환기(Converter)를 지정하는 전략 인터페이스(Strategy Interface)야. Spring REST는 HTTP 응답을 JSON 또는 XML 같은 적절한 형태로 변환하는데 이 인터페이스를 사용하지.

각 HttpMessageConverter 구현체는 하나 이상의 MIME Type에 관련되어있어. Spring은 Client가 어떤 형태의 응답을 요청했는지를 "Accept" header를 이용해서 판단해. 그러면, 특정 콘텐츠 유형을 처리할 수 있도록 등록된 HttpMessageConverter를 찾아 Client로 보내기 전에 응답을 해당 형식으로 변환할 수 있지. -- 강좌 소개라 이후는 생략합니다 --


9. 새로운 타입의 요청/응답을 지원하기 위해서 어떻게 HttpMessageConverter 구현체를 만드나?


그냥 HttpMessageConverter의 구현체를 만드는 게 필요할 뿐이지. 그리고 새로운 유형의 요청/응답을 생성할 클래스들을 WebMvcConfigurerAdapter#extendMessageConverters()을 이용해서 등록하기만 하면 돼.


10. REST는 일반적으로 Stateless인가?


그래, Stateless 한 HTTP를 기반으로 하니까 REST API 또한 Stateless여야해. REST API에서의 요청은 그것을 처리하는데 필요한  모든 상세정보를 포함해야해. 이전 또는 다음 요청이라던가 서버 단에서 유지하고 있는 세션과 같은 일부 데이터에 의존해서는 안 돼. REST 명세에는 Stateless를 위한 제약을 넣고, REST API를 설계하는 동안 유념해야해.


11. @RequestMapping은 무엇을 하는건가?


@RequestMapping은 웹 요청을 Spring Controller의 Method에 맵핑하기 위해 사용하는 거야. HTTP Method를 기반으로 웹 요청을 맵핑할 수 있어. GET이나 POST 또는 여러 가지 다른 파라미터들 같은 것을 말하지.

예를 들어서 Spring을 이용해서 RESTful web service를 개발하는 경우 특정 Media Type 어노테이션과 함께 produce/consume 속성을 이용해서 아래와 같이 Method가 JSON을 produce/consume 하는 데만 사용됨을 나타낼 수 있어.
@RequestMapping (method = RequestMethod.POST, consumes="application/json")
public Book save(@RequestBody Book aBook) {
   return bookRepository.save(aBook);
}

비슷하게 JSON 또는 XML을 생성하는 다른 handler method도 생성할 수 있어.
-- 강좌 소개라 이후는 생략합니다 --


12. @Controller와 @RestController는 stereotype 인가? (Answer)


맞아. @Controller와 @RestController는 모두 stereotype이야. 실제로 @Controller는 @Component을 특별화한 stereotype 어노테이션이야. 이것은 @Controller 라는 어노테이션이 클래스는 Spring container의 component scanning 과정에서 Spring container에 의해 자동으로 감지되는 것을 의미해.

그리고, @RestController는 RESTful web service를 위해서 @Controller가 특별화된 것이야. 이것은 단순히 @Controller와 @ResponseBody를 결합해 놓은 것 이상의 의미로 그 Controller 클래스가 RESTful 요청을 다루기 위한 것임을 명확히 해주지.

Springframework는 이 어노테이션을 사용해서 향후 REST API 개발과 관련된 더 유용한 기능들을 제공하게 될 수도 있어.


13. @Controller와 @RestController의 차이는 뭐지? (Answer)


@Controller와 @RestController는 내가 이전에 작성한 글(12와 13번의 Answer 링크) 상당히 많은 차이가 있어. 하지만 가장 큰 차이는 @RestController는 @RequestBody 어노테이션이 자동으로 적용된다는 것이야. 즉, @RequestBody를 따로 사용할 필요가 없다는 것이지.

이것은 Spring을 이용한 RESTful web service를 더욱 쉽게 개발할 수 있게 해주지.
-- 강좌 소개라 생략합니다 --


14. Spring MVC에서 언제 @ResponseBody 를 사용해야 하지?


@ResponseBody 어노테이션은 return type을 모델에 배치하거나 뷰 이름으로 해석하지 않고 직접 HTTP 응답의 Body에 써야 함을 지정할 때 사용할 수 있어.

예를 들면,
@RequestMapping(path = "/hello", method = RequestMethod.PUT)
@ResponseBody
public String helloWorld() {
   return "Hello World";
}

또는 다른 대안으로 @Controller 대신 @RestController를 사용할 수도 있어. 앞서 말했듯이 @RestController에는 @ResponseBody가 자동으로 적용되기 때문에 @ResponseBody를 사용하지 않아도 돼.


15. Spring MVC에서 @PathVariable은 무엇을 하는거지? 왜 Spring을 이용한 REST에서 @PathVariable이 유용하지?


Query Parameter처럼 URI에서 직접 Value를 읽을 수 있도록 해주는 Spring MVC의 유용한 어노테이션 중 하나야. RESTful web service를 Spring으로 만들 때 특히 유용한 어노테이션이야. 왜냐하면 REST에서는 자원의 식별값을 URI 일부로 지정하기 때문이지. 이 질문은 일반적으로 4~6년 정도의 경험을 가진 경험 많은 Spring MVC 개발자들이 질문해.(글쎄요. 과연 그럴까요? - 역자주)

예를 들어서, http://myapp.com/books/101 라는 URL은 ID를 추출하는 방법을 쉽게 배우고 바로 Spring MVC에 @PathVariable 어노테이션을 사용할 수 있게 해줄 꺼야.
-- 강좌 소개라 생략합니다 --


16. 성공적으로 DELETE 문이 성공한 후에 어떤 HTTP status 를 반환해야해?


성공적으로 DELETE를 완료한 후에 어떤 status code를 리턴해야 하는지에 대해서 정해진 룰은 없지만, 200 OK 거나 204 No Content 일 거야.

일반적으로는, 만약 DELETE 작업이 성공적으로 완료되고 응답의 Body가 비어있다면, 204 No Content를 리턴하지. 만약 DELETE 작업이 성공적으로 완료되고 응답의 Body가 비어있지 않다면, 200 OK를 리턴해.


17. CRUD는 무엇을 의미해?


CRUD는 Create, Read, Update, Delete의 약자야. REST API에서는 POST는 Resource를 생성(Create)하고, GET은 Resource를 읽고(Read), Put은 Resource를 업데이트(Update)하는 데 사용되고, DELETE는 Resource를 삭제(Delete)하는데 사용돼.
이 질문은 주로 1~3년 차의 경험을 가진 초보개발자들이 질문하는 초보레벨의 Spring MVC 질문의 하나야.


18. @EnableWebMvc 는 어디에 필요하지?


@EnableWebMvc 어노테이션은 Spring MVC 설정을 XML방식대신에 Java 설정(Java Configuration)을 이용해서 설정하고 Spring MVC를 활성화하기 위해 필요하지. XML 방식의 <mvc: annotation-driven> 와 동일한거야. @Controller 어노테이션이 적용된 클래스의 @RequestMapping 된 handler method의 맵핑을 활성화 하기 위해 Java 설정에 사용되는 어노테이션이야.


19. Spring MVC에서 @ResponseStatus 어노테이션은 어제 필요해?


3~5년 정도 경력의 Spring 개발자에게 적합한 좋은 질문이야. @ResponseStatus은 Spring MVC 와 REST에서 에러처리를 하는데 필요한 어노테이션이야. 일반적으로 서버에서 에러 또는 예외가 발생한 경우에는 HTTP status code 500 - Internal server error가 반환되지.

이건 사람에게는 효과적이지만 REST Client에는 유용하지 않아. 만약 Resource를 찾지 못한 경우 404 같은 코드를 보내주는 것처럼 적절한 status code를 반환해야 할 거야. 바로 이곳이 @ResponseStatus를 사용할 수 있는 곳이야. 이 어노테이션을 사용하면 예외의 경우 적절한 오류 메시지와 함께 사용자 정의 HTTP status code를 보낼 수 있을 거야.

@ResponseStatus를 사용하기 위해서는 적절한 사용자 정의 예외를 생성하고 @ResponseStatus 어노테이션에 적절한 HTTP status code와 reason을 지정하면 돼.

만약 그 예외가 해당 Controller handler method에서 발생하고 그 예외를 다른 곳에서 처리하지 않았다면 적절한 HTTP status가 있는 적절한 HTTP 응답이 client에게 보내질 거야.

예를 들어서, 아래와 같이 책 정보를 제공하는 도서관의 RESTful web service를 개발한다고 할 때, 요청한 책을 찾지 못했을 때 Internal Server Error(500)를 응답으로 주는 대신에 Http status code 404를 반환해 줄 수 있어.

@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="No such Book")  // 404
public class BookNotFoundException extends RuntimeException {
     // ...
}

만약 어떤 handler method에서 이 예외가 발생한다면 클라이언트에게 reason으로 "No such Book"을 갖는 HTTP status code 404가 보내질 거야.
-- 강좌 소개라 생략합니다 --


20. REST는 안전해? 안전하게 하려면 어떻게 해야해? (Answer)


이 질문은 REST와 Spring에서 모두 2~5년 정도의 경험을 가지고 있는 자바 프로그래머들이 하는 질문이야. 보안은 광범위한 용어지만, 인증 및 권한부여에 의해 제공되는 암호화와 접근제한을 통한 메시지의 보안을 말한다고 할 수 있지. 보통의 REST는 안전하지 않지만, Spring Security를 통해서 안전하게 만들 수 있어.

최소한으로 Spring Security의 설정에서 HTTP를 사용하여 HTTP basic authentication을 활성화할 수 있어. 비슷하게, 서버가 HTTPS 하단에 위치한다면 REST API를 HTTPS로 노출할 수도 있지.


21. REST는 TLS(Transport Layer Security)와 함께 동작해?


TLS(Tranport Layer Security)는 server와 client 간의 보안통신에 사용되는거지. HTTPS가 SSL과 TLS 모두에서 동작하기 때문에 REST도 TLS와 함께 동작할 수 있어.

사실 REST는 서버에 적용된 보안 프로토콜에 의존하지. 서버가 SSL을 지원한다면, 같은 RESTful web service에 HTTP와 HTTPS 모두로 접근할 수 있어.

만약 톰캣을 사용한다면, 톰캣에서 어떻게 SSL을 활성화 할 수 있는지를 좀 더 알아보면 돼.


22. RESTful web service를 개발하려면 Spring MVC를 classpath에 추가해야만 해?


이 질문은 1~2년 정도의 Spring 경험을 가지고 있는 개발자들이 주로 하는 질문이야. 간단히 대답하자면 맞아야. Springframework를 이용해서 RESTful web service를 개발하려면 Spring MVC를 classpath에 추가 해야해.

사실 Spring MVC는 @RestController, @ResponseCode, @ResponseBody, @PathVariable 같은 유용한 어노테이션을 모두 포함하고 있어. 따라서, spring-mvc.jar를 사용하거나 적절한 Maven 엔트리를 pom.xml 파일에 추가 해야해.

-- 이하 결론 부분은 생략 --

엉성한 번역을 읽으시느라 수고하셨습니다.

언제나 그렇지만 조금이나마 도움이 된다면 좋겠네요.

댓글 없음:

댓글 쓰기