JavaRush /Java Blog /Random-KO /취업을 위한 시험과제, 알아보자..
timurnav
레벨 21

취업을 위한 시험과제, 알아보자..

Random-KO 그룹에 게시되었습니다
친구들, 안녕하세요 여러분. 저는 러시아 회사에서 Java 개발자의 지위에 대한 테스트 과제를 해결한 경험을 여러분과 공유하고 싶습니다. 과제의 주요 기능을 구현하는 것이 특별히 어렵지는 않지만 항상 그렇듯이 세부 사항과 작은 것들이 중요하기 때문에 제 시간에 제출할 수 없었으며 과제에 대해 아무 대답도하지 않았습니다. 내가 보냈을 때 이미 가득 차 있었어요. 내가 나에게 요구되는 모든 일을 수행했는지 확인하기 위해 작업을 조사해 보시기 바랍니다. 그리고 어떻게 만드는지 모르시는 분들을 위해 제가 어떻게 처리했는지 물을 많이 추가하겠습니다. 이에 관심이 있는 분이라면 고양이에 오신 것을 환영합니다. 여기에 전체 솔루션을 게시하지는 않겠다고 바로 말씀드리지만, 초보자를 위한 많은 설명이 있을 것이며, 누군가 제 글을 읽는 데 관심이 없다면 여기 github에 있는 프로젝트가 있습니다 . 작업 자체의 텍스트입니다.
테스트 과제 1번
설명: API 서버(JSON HTTP API) 개발 도구: Java 프레임워크: Play Framework 2.4(또는 이상) 또는 Spring boot 1.2.3(또는 이상) 데이터베이스: MySQL 프로토콜: HTTP, 포트 80 기능(요청):
  1. 짐을 싣는 사람.
    • 파일(JPG 아바타 사진)을 서버로 전송합니다.
    • 이미지를 서버의 디렉토리에 저장합니다.
    • 서버 응답은 이미지의 내부 URI입니다.
  2. 새로운 사용자를 추가합니다.
    • 당사는 사용자의 개인 데이터(이미지의 URI, 사용자 이름, 이메일 등)를 서버로 전송합니다.
    • 우리는 정보를 데이터베이스에 저장합니다.
    • 서버 응답은 새 사용자의 고유 ID입니다.
  3. 사용자에 대한 정보를 얻습니다.
    • 고유한 사용자 ID를 서버로 전송합니다.
    • 데이터베이스에서 정보를 읽는 중입니다.
    • 서버의 응답은 사용자의 개인 데이터입니다(위 참조).
  4. 사용자 상태 변경(온라인, 오프라인)
    • 고유한 사용자 ID와 새로운 상태(온라인, 오프라인)를 서버로 전송합니다.
    • 사용자 상태 변경.
    • 서버 응답 - 고유한 사용자 ID, 신규 및 이전 상태.
    참고: 서버가 외부 API/데이터베이스를 쿼리하고 있습니다. 이는 단순화된 테스트 작업이므로 시뮬레이션된 액세스와 5~10초의 시간 지연이 있는 "스텁"을 구현해야 합니다.
  5. 서버 통계.
    • 우리는 서버에 매개변수를 전송합니다: 1. 클라이언트 상태(온라인, 오프라인 또는 부재), 2. 요청의 고유 ID(타임스탬프)(부재할 수 있음)
    • 서버 응답은 상태, 사진 URI, 요청의 고유 ID(타임스탬프)가 포함된 사용자 목록입니다.
    참고: 요청에 매개변수가 포함된 경우 서버는 이를 기준으로 응답을 필터링해야 합니다. 요청에 요청(이전에 수신됨)의 고유 ID(타임스탬프)가 포함되어 있는 경우 서버는 이 고유 ID(타임스탬프) 이후에 상태가 변경된 사용자만 반환해야 합니다.
필수 요구사항:
- 편안해요. - 모든 데이터는 JSON 형식입니다. - API 서버는 요청 3과 5가 (요청 1, 2, 4에 비해) 가장 높은 우선순위를 가지며 최대한 빨리 완료되어야 한다는 점을 고려하여 설계되어야 합니다. - 처리 중 오류가 발생했습니다.
선택적 요구사항(바람직함):
- 코드 문서화. - API 서버 아키텍처는 높은 부하와 확장성을 갖도록 설계되어야 합니다. - 테스트.
검사 결과:
- 테스트 작업의 결과는 아카이브에 배포에 대한 자세한 지침과 함께 제공되어야 합니다. 테스트 작업을 위한 Docker 컨테이너를 빌드하려면 Dockerfile을 연결하는 것이 좋습니다. github.com에서 다운로드 가능합니다. - 생성된 API에 대한 간략한 문서를 포함해야 합니다(요청 목록, 요청 매개변수, 요청 형식, 응답 형식 등). - 설계, 프로그래밍, 문서화 등의 맥락에서 테스트 작업에 소요된 시간에 대한 정보 이 테스트 작업은 지식과 기술을 평가하기 위한 것일 뿐 완제품(API 서버)을 만드는 것을 목표로 하지 않으므로 설명과 이유를 포함한 단순화가 허용됩니다.
세심하고 숙련된 프로그래머는 다음 섹션을 건너뛸 수 있습니다. 여기서는 작업 자체의 텍스트를 다루겠습니다. 작업의 "헤더"는 이해하는 데 어려움을 일으키지 않으므로 내 선택이 Spring Boot에 있다고 말하겠습니다. 그러나 이미 작업을 수행했기 때문이 아니라 이미 다음을 사용하여 실제 프로젝트를 완료했기 때문입니다. Spring (하지만 단순성 때문에 Boot는 거기에 없었습니다.) 서버 기능에 따라: 1) 파일 다운로더. 여기에는 기본적으로 복잡한 것이 없습니다. 사진이 일반적으로 서버에 어떻게 저장되는지 알아내면 되었고, 가장 편리한 방법은 사진을 특별한 디렉토리에 배치하는 것이었습니다. 아래에서 구체적인 구현을 살펴보겠습니다. 2) 새로운 사용자를 추가하는 간단한 작업입니다. CRUD 애플리케이션을 만든 적이 있다면 그는 나를 지원할 것이고, 그렇지 않은 경우 아래의 모든 것을 볼 수 있습니다. 3) 이용자에 관한 정보를 취득합니다. 질문이 없습니다. 모든 것이 명확합니다. 4)사용자 상태를 변경합니다. 작업의 처음 두 가지 사항은 날짜로 명확하지만 외부 요청은 어떻습니까??? 100g이 없으면 알아내는 것이 불가능합니다. 지금도 제가 올바르게 이해했는지 100% 확신할 수 없습니다. 자세한 내용은 아래를 참조하세요. 5)서버 통계. 이것도 흥미롭습니다. 첫 번째 요점은 매개변수에 대한 다양한 옵션을 사용하여 메소드를 구현하는 것을 제안하지만, 이것이 컨트롤러 메소드여야 한다는 점을 감안할 때 이를 수행하는 방법은 아직 명확하지 않습니다. 두 번째 요점은 잠시 후 상태가 변경된 모든 사용자에게 묻는 것으로, 분명한 것 같지만 미묘함이 있습니다.
시작하기
아, 이 작업을 하면서 이 문구를 몇 번이나 읽었는지! Spring에서 프로젝트를 설정하는 방법을 알아내려고 노력했지만 어떤 이유로 Spring Boot를 사용해 본 적이 없다면 축하합니다. 제가 아래에 쓸 내용에 매우 기뻐하실 것입니다. 프로그래머가 프로젝트에서 프로젝트로 매우 많은 양의 코드를 전송하는 데 사용했던 곳을 읽었습니다. 이것은 템플릿 코드입니다. 예를 들어 데이터베이스 연결 설정, 서블릿 매핑 등을 위한 설정입니다. 작업을 위한 템플릿 코드 우리는 데이터베이스에 JPA/Hibernate를 사용합니다. 일부 템플릿을 숨기지만 이를 구성하려면 다시 xml 파일이나 구성 클래스를 작성해야 합니다. 그리고 작은 프로젝트가 있다면 더 적은 코드를 작성하는 것이 아니라 그 반대의 경우도 마찬가지입니다. 다음으로 Spring에서 JPA 작업을 마무리합니다. 많은 프로젝트가 있지만 가장 편리한 것은 물론 Spring Data입니다. 이것은 JPA, NoSQL 및 다양한 프로젝트를 포함하여 가능한 모든 작업을 수행할 수 있는 매우 큰 프로젝트입니다. 믿을 수 없을 정도로 마법적이므로 프로젝트에서 사용할 것입니다. Spring을 사용하면 데이터베이스 연결 설정이 거의 제거되고 Spring이 우리를 위해 모든 작업을 수행합니다. 트랜잭션성, 캐싱 및 특수한 경우 컨텍스트 구성에서 Google(다른 항목 참조)에 대한 기타 설정에 필요한 주석만 추가하면 됩니다. 그러나 동시에 대부분의 초보 개발자는 Spring에서 프로젝트를 생성하는 방법을 전혀 모릅니다. localhost:8080/*로 시작하는 링크를 따라 프로젝트를 실행하고 브라우저에서 결과를 얻도록 구성하는 방법을 완전히 아는 사람은 아무도 없습니다. 그리고 Spring Boot가 등장합니다! 구체적인 예를 들어 Spring Boot에 대해 이야기하는 것이 더 좋습니다! 공백부터 시작해 보겠습니다. Spring Boot 프로젝트를 생성하기 위해 Spring 개발자는 템플릿 생성을 위한 "생성자"를 고안했습니다. 해당 웹사이트에서 사용할 수 있지만 우리가 가장 선호하는 IDE인 Intellij IDEA에서 사용하는 것이 훨씬 더 쉽습니다. File->New->Project 창에서 Spring 초기화 탭으로 이동하면 jdk가 그 안에 설정되어야 하고 URL은 https://start.spring.io이며 인터넷 연결을 확인한 다음 필요합니다. 이름과 사용할 기술을 선택하려면 첫 번째 단계에서는 WEB만 필요합니다. 옆에 체크 표시를 하면 프로젝트가 생성됩니다. Maven이 모든 종속성을 가져오려면 아이디어에서 Maven 탭을 열고 업데이트 버튼을 클릭해야 합니다. 클라이언트-서버 통신을 위한 모든 설정이 포함된 기성 애플리케이션 템플릿을 받았습니다. 첫인상을 얻기 위해 컨트롤러 클래스를 만들어 보겠습니다. 아마도 MVC에 대해 들어본 적이 있을 것입니다. 모든 Spring 애플리케이션에서 컨트롤러는 매우 단순한 디자인을 가지고 있습니다. 이는 @Controller 주석(@RestController와 같은 접두사가 가능함)으로 표시된 클래스이며, 이 클래스는 들어오는 요청을 처리하는 역할을 합니다. 컨트롤러가 일부 주소에 대한 요청을 인식하려면 이 주소를 컨트롤러 메서드에 매핑해야 합니다. import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(value = "/hello") public class DemoController { @RequestMapping(method = RequestMethod.GET) public String halloWorld() { return "Hello World!"; } @RequestMapping(value = "/{name}", method = RequestMethod.GET) public String halloName(@PathVariable("name") String name) { return "Hello, " + name + "!"; } } 여기서 무슨 일이 일어나고 있는지 알아 봅시다. @RestController . 위에서 쓴 주석과 똑같습니다. 우리는 결과를 즉시 보고 싶고 .jsp 페이지를 작성하고 싶지 않기 때문에 나머지 컨트롤러를 사용합니다. (와우) 결과를 브라우저에서 문자열로 즉시 보는 것이 더 쉬울 것입니다. @RequestMapping은 단지 주소에 대한 바인딩입니다. 공개 주소 접두사는 localhost:8080입니다. 보시다시피, 전체 클래스가 /hello 주소에 정지됩니다 . 이는 이 클래스 내의 모든 메소드에 접두어 localhost:8080/hello가 있음을 의미합니다. 다음은 클래스의 첫 번째 메서드입니다. 자체 매핑에는 Http 프로토콜 메서드가 표시됩니다. GET 요청(Http 프로토콜 메서드에 대해 직접 읽어보세요.) 이것이 의미하는 바는 무엇입니까? localhost:8080/hello 주소로 GET 요청을 하면 “Hello World!” 문자열 형식의 응답을 받게 됩니다. 확인해 보겠습니다! DemoApplication 클래스에는 @SpringBootApplication이라는 전체 Spring 컨텍스트를 단독으로 실행한다고 할 수 있는 멋진 주석이 하나 있습니다. 이 클래스의 기본 메소드는 마법처럼 변합니다. SpringApplication에 숨겨진 모든 마법을 실행합니다. 이 클래스에서 컨텍스트 메뉴를 호출하면 실행 라인에 옵션이 표시됩니다. 녹색 표시로 일찍 실행하는 것이 좋습니다. 콘솔은 더 보기 좋아질 것이며 앞으로는 콘솔에서 직접 로그를 읽는 것이 더 쉬워질 것입니다. 애플리케이션을 실행해 보겠습니다. 콘솔 출력이 중지되면 콘솔에 표시되어야 합니다.
2015-09-02 09:25:36.895 INFO 5844 --- [ 메인] sbceTomcatEmbeddedServletContainer : Tomcat이 포트에서 시작되었습니다: 8080 (http) 2015-09-02 09:25:36.900 INFO 5844 --- [ 메인] 데모.DemoApplication : ****초 만에 DemoApplication을 시작했습니다(JVM은 15.501에서 실행 중).
여기서 "****"는 애플리케이션 실행 기간입니다. 그 후 모든 브라우저(또는 컬 또는 사용하는 모든 항목)에서 컨트롤러 메소드가 매핑된 주소를 입력해야 합니다.
로컬 호스트:8080/안녕하세요
브라우저는 표준을 표시해야 합니다
안녕하세요 월드!
여기 당신을 위한 웹 애플리케이션이 있습니다! 컨트롤러에 다른 메소드가 있는 것을 발견한 경우 자체 주소 매핑이 있으며 자리 표시자가 현재 주소에 추가됩니다. 이는 Spring에 의해 매개변수로 메소드에 전달됩니다. @PathVariable 주석이 이에 대한 책임이 있다고 추측하는 것은 어렵지 않습니다. 그래서 요청에 따라
localhost:8080/hello/당신의 이름
브라우저가 표시됩니다
안녕하세요, 당신의 이름입니다!
Spring Boot의 기본 사항을 정리했습니다. 다음으로 데이터베이스를 첨부할 예정인데, 이에 대해서는 다음 포스트에서 다루겠습니다. 모두에게 감사드립니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION