- Created by Sansae, last modified on Feb 15, 2020
 
You are viewing an old version of this page. View the current version.
Compare with Current View Page History
« Previous Version 18 Current »
WebUI개발을 위한 의존성 라이브러리 추가
pom.xml

pom.xml
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
/home 에서 WebUI를 보여주도록 WebController를 추가합니다.
  src/main/java/com/example/demo/WebController.java Expand source
 
 package com.example.demo;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
@Controller
@RequiredArgsConstructor
public class WebController {
    @GetMapping("/home")
    public String home(Model model) {
        return "home";
    }
}
 하드코딩된 BaseURL을 삭제 합니다.
- LinkController 와 LinkService를 같이 수정해야 합니다.
 
src/main/resources/application.properties
- app.baseUrl=http://localhost:8080/
LinkController를 리펙토링 합니다.
  src/main/java/com/example/demo/LinkController.java Expand source
 
 package com.example.demo;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import lombok.RequiredArgsConstructor;
import lombok.Value;
import reactor.core.publisher.Mono;
@RestController
@RequiredArgsConstructor
public class LinkController {
    private final LinkService linkService;
    @PostMapping("/link")
    Mono<CreateLinkResponse> create(@RequestBody CreateLinkRequest requestLink) {
        return linkService.shortenLink(requestLink.getLink())
                .map(CreateLinkResponse::new);
    }
    @GetMapping("/link/{key}")
    Mono<ResponseEntity<Object>> getLink(@PathVariable String key) {
        return linkService.getOriginalLink(key)
                          .map(link -> ResponseEntity.status(HttpStatus.PERMANENT_REDIRECT)
                                                     .header("Location", link.getOriginalLink())
                                                     .build())
                          .defaultIfEmpty(ResponseEntity.notFound().build());
    }
    @Value
    public static class CreateLinkRequest {
        private String link;
    }
    @Value
    public static class CreateLinkResponse {
        private String shortenedLink;
    }
}
 LinkService를 리펙토링 합니다.
  src/main/java/com/example/demo/LinkService.java Expand source
 
 package com.example.demo;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
@Service
public class LinkService {
    private final LinkRepository linkRepository;
    public LinkService(LinkRepository linkRepository) {
        this.linkRepository = linkRepository;
    }
    Mono<String> shortenLink(String link) {
        String randomKey = RandomStringUtils.randomAlphabetic(6);
        return linkRepository.save(new Link(link, randomKey))
                             .map(result -> result.getKey());
    }
    Mono<Link> getOriginalLink(String key) {
        return linkRepository.findByKey(key);
    }
}
 
  LinkControllerTest Expand source
 
 package com.example.demo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.reactive.server.WebTestClient;
import reactor.core.publisher.Mono;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.when;
@RunWith(SpringRunner.class)
@WebFluxTest(controllers = LinkController.class)
public class LinkControllerTest {
    @Autowired
    private WebTestClient webTestClient;
    @MockBean
    private LinkService linkService;
    @Test
    public void shortensLink() {
        when(linkService.shortenLink("https://spring.io")).thenReturn(Mono.just("aass2211"));
        webTestClient.post()
                     .uri("/link")
                     .contentType(MediaType.APPLICATION_JSON)
                     .syncBody("{\"link\":\"https://spring.io\"}")
                     .exchange()
                     .expectStatus()
                     .is2xxSuccessful()
                     .expectBody()
                     .jsonPath("$.shortenedLink")
                     .value(val -> assertThat(val).isEqualTo("aass2211"));
    }
    @Test
    public void redirectsToOriginalLink() {
        when(linkService.getOriginalLink("aaa21123"))
                .thenReturn(Mono.just(new Link("http://sprint.io", "aaa21123")));
        webTestClient.get()
                     .uri("/link/aaa21123")
                     .exchange()
                     .expectStatus()
                     .isPermanentRedirect()
                     .expectHeader()
                     .value("Location", location -> assertThat(location).isEqualTo("http://sprint.io"));
    }
}
 
  LinkServiceTest Expand source
 
 package com.example.demo;
import org.junit.Before;
import org.junit.Test;
import org.mockito.stubbing.Answer;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class LinkServiceTest {
    private LinkRepository linkRepository = mock(LinkRepository.class);
    private LinkService linkService = new LinkService(linkRepository);
    @Before
    public void setup() {
        when(linkRepository.save(any()))
                .thenAnswer((Answer<Mono<Link>>) invocationOnMock -> Mono.just((Link) invocationOnMock.getArguments()[0]));
    }
    @Test
    public void shortensLink() {
        StepVerifier.create(linkService.shortenLink("http://spring.io"))
                    .expectNextMatches(result -> result != null && result.length() > 0)
                    .expectComplete()
                    .verify();
    }
}
 - No labels