Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Info
iconfalse

Table of Contents


  • WebUI개발을 위한 의존성 라이브러리 추가

Info
iconfalse
titlepom.xml

Code Block
languagexml
themeMidnight
titlepom.xml
linenumberstrue
        <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를 추가합니다.

Code Block
languagejava
themeMidnight
titlesrc/main/java/com/example/demo/WebController.java
linenumberstrue
collapsetrue
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를 같이 수정해야 합니다.
Info
iconfalse
titlesrc/main/resources/application.properties
Info
iconfalse

- app.baseUrl=http://localhost:8080/

  • LinkController를 리펙토링 합니다.

Code Block
languagejava
themeMidnight
titlesrc/main/java/com/example/demo/LinkController.java
linenumberstrue
collapsetrue
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를 리펙토링 합니다.

Code Block
languagejava
themeMidnight
titlesrc/main/java/com/example/demo/LinkService.java
linenumberstrue
collapsetrue
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);
    }
}

...