기본 콘텐츠로 건너뛰기

[간단번역] 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 파일에 추가 해야해.

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

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

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

댓글

이 블로그의 인기 게시물

경력 개발자의 자기소개서에 대해서...

갑자기 뜬금없이 이런 글을 쓰다니 무슨 생각이야? 라고 생각하시는 분들이 있을지도 모르겠네요. 뜬금없음에 대한 변명은 잠시 접어두고 일단 오늘 쓰려고 하는 글을 시작해볼까 합니다. 개발자로 대충 16년을 그럭저럭 보내왔습니다. 시대적 상황으로 5년 차쯤에 대리로 처음 팀장을 시작했으니, 일반 개발자로 산 시간보다는 어쨌건 프로젝트 또는 팀의 리더로 산 시간이 더 많았던 것 같습니다. 그 기간 동안 남들보다 좀 심하게 회사를 많이 옮겨 다니다 보니 꽤 많은 면접을 볼 수 있는 경험이 있었고, 또 옮긴 회사가 대부분 팀을 리빌딩하는 곳이었다 보니 꽤 많은 채용절차에 관여할 기회가 있어서 어린 나이부터 비교적 많은 이력서를 검토했고 면접관으로도 여러 사람을 만날 수 있었습니다. 처음 면접을 보러 다니던 시절의 제 이력서의 자기소개서는 항상 "19XX년 봄 XX업계에 종사하시던 아버님과 집안일에 헌신적인 어머니의 유복한 가정에 1남 1녀의 막내로..." 로 시작되었습니다 (이 문장에 향수를 느끼시는 분들 많으실 거예요. ^^). 경력이 5년이 넘은 어느 날 도대체 이 문장을 왜 써야 하느냐는 의문이 생겨서 조금 바꾸긴 했습니다만, 그 뒤로도 꽤 오랜 세월을 이런 자기소개서가 항상 제 이력서에 붙어있었죠. 요즘 누가 저런 식으로 자기소개서를 써? 라고 생각하시는 분들 많으실 거로 생각해요. (대신 요즘은 대학 시절의 봉사활동이나 해외연수 이력이... 뭐 어차피 그놈이 그놈입니다.) 저런 자기소개서를 써야 한다는 것이 어디서 어떻게 시작된 것인지는 몰라도 회사를 그만두기 전인 2년 전까지도 약간의 표현은 다를지 모르지만 비슷한 문장으로 시작하는 자기소개서를 이력서에 첨부해서 보내는 지원자들을 볼 수 있었습니다. 이제 제가 뜬금없는 이런 글을 쓰게 된 이유를 밝히고 계속 진행해야겠네요. 블로그에 올릴 글을 준비하는 일이 생각보다 힘들어요. 블로그에 올리려고 준비한 주제에 맞는 소스를 작업하고 거기에 글을 입히다 보면 가끔

Springframework 5에서 바뀌는 것들에 대한 간단 정리 및 생각

Spring framework 5 에 대해 많은 분이 기대와 두려움을 가지고 계시지 않을까 생각합니다. 특히 기대를 하고 계신 분들은 Reactive Programming 지원을 기대하고 계시지 않은가 생각이 드는데요. 7월 초에 John Thompson 이란 분이 D-Zone에 아주 깔끔하고 멋지게 정리를 잘해서 글을 쓰셨더라구요. 해당 글은  https://dzone.com/articles/whats-new-in-spring-framework-5 에서 확인을 하실 수 있습니다. 혹시 Spring framework 5에서 달라지는 내용의 좀 더 자세한 내용이 필요하신 분들은 Spring framework github의 wiki 를 참고하시면 됩니다. 본 포스트는 언제나 그렇듯이 윗글에 대한 번역이 아닙니다. 그저 윗글을 다시 정리하면서 제 생각을 한번 정리해 놓은 포스트입니다. Spring framework 5는 현재 5.0.0.RC2(2017.07.23일 기준)까지 릴리즈된 상황입니다. Spring framework 5에서 크게 변화하는 내용을 John Thompson은 8가지로 깔끔하게 정리해주고 있습니다. 1. JDK 지원 버전의 업데이트 5버전은 원래 JDK 9 버전의 지원을 위해서 시작됐던 프로젝트로 알고 있는데 맞는지는 모르겠네요. JDK 9의 Release가 늦어져서 Spring framework 5가 먼저 Release 될 것으로 보이지만, JDK 9가 Release가 되면 언제건 적용할 수 있다고 합니다. 좀 아쉬운 부분은 JDK의 최소 버전은 JDK 8이라는 부분이 아닐까 싶네요. 이 때문에 Spring framework 5에 무관심한 분들도 많으실 거라고 생각합니다. 지금 진행하는 프로젝트는 JDK 8을 기반으로 합니다만, 최근까지 다니던 회사의 경우는 JDK 7까지가 업그레이드 한계였던 회사였습니다. 아마도 JDK 업그레이드를 쉽게 못 하시는 회사들이 많으니 "나랑은 관계없는 얘기군"

Gradle 을 이용해서 Multiproject 를 구성하는 방법 (중 하나)

개요 회사에서 Gradle 을 이용하게 된 이래로 계속 Multi-project 형태로 설정하여 진행을 해 오고 있다. 매번 멀티 프로젝트 형태로 만들어지고 있는 회사의 프로젝트들이다 보니 그때마다 다시 이전 빌드 스크립트를 보면서 만드는데 프로젝트들이 복잡하다보니 필요없는 설정들까지 복사해서 쓰고 있는 부분들이 있어서 한번 정리를 했으면 하고 있었다. 가장 기본적인 상태의 멀티프로젝트용 build.gradle 에 대한 여러가지 방법 중 한가지라 생각하고 참고가 된다면 좋겠다. 요구사항 기본 요구사항은 다음과 같다. 1) 멀티프로젝트는 디렉터리를 기반으로 아래와 같이 그룹으로 만들어 질 수 있어야 한다.   - Shared : 다른 프로젝트에서 Dependency로 추가될 수 있는 공통 라이브러리를 포함하는 라이브러리 모듈 그룹   - Web : Front 모듈 그룹   - Server : 주로 어플리케이션 간의 설정 등을 관리하는 Server 모듈 그룹   - Service : Web API 서버 모듈 그룹 2) 모든 Subproject 들은 Java project 이며, 프로젝트 명은 "모듈그룹명-모듈명" 으로 만든다. 즉, Server 모듈의 configuration-server 모듈이라면 server-configuration-server의 형태로 만들어지면 된다. 이후에 작업된 모든 내용은 Ubuntu 14.04 OS와 IntelliJ IDEA 15에서 작업되었다. (윈도우즈와 이클립스에서도 동일한 내용을 동작이 될 것으로 보인다. 다만, 테스트되지 않았을 뿐이다) Main Gradle Script 작업 1) 파일 구성   - build.gradle : gradle script 파일   - settings.gradle : sub project 관리를 위한 파일 2) build.gradle 파일 작성   - 우선은  프로젝트 기본 정보로 group 정보와 version 을 설정한다. 본인의