Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions src/shorturl/Client.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package shorturl;

import shorturl.controller.ShortUrlController;
import shorturl.repository.ShortUrlRepository;
import shorturl.service.Base62Converter;
import shorturl.service.ShortUrlService;
import shorturl.view.InputView;
import shorturl.view.OutputView;

public class Client {

public static void main(String[] args) {
InputView inputView = new InputView();
OutputView outputView = new OutputView();
ShortUrlRepository repository = new ShortUrlRepository();
Base62Converter converter = new Base62Converter();
ShortUrlService shortUrlService =
new ShortUrlService(repository, converter);

ShortUrlController shortUrlController =
new ShortUrlController(inputView, outputView, shortUrlService);

shortUrlController.run();
}
}
37 changes: 37 additions & 0 deletions src/shorturl/controller/ShortUrlController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package shorturl.controller;

import shorturl.service.ShortUrlService;
import shorturl.view.InputView;
import shorturl.view.OutputView;

public class ShortUrlController {

private final InputView inputView;
private final OutputView outputView;
private final ShortUrlService shortUrlService;

public ShortUrlController(InputView inputView,
OutputView outputView,
ShortUrlService shortUrlService) {
this.inputView = inputView;
this.outputView = outputView;
this.shortUrlService = shortUrlService;
}

public void run() {
while (true) {
String originalUrl = inputView.readOriginalUrl();

if (originalUrl.equals("exit")) {
break;
}

String shortUrl = shortUrlService.createShortUrl(originalUrl);
outputView.printShortUrl(shortUrl);

String inputShortUrl = inputView.readShortUrl();
String redirectUrl = shortUrlService.findOriginalUrl(inputShortUrl);
outputView.redirectToOriginalUrl(redirectUrl);
}
}
}
22 changes: 22 additions & 0 deletions src/shorturl/repository/ShortUrlRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package shorturl.repository;

import java.util.HashMap;
import java.util.Map;

public class ShortUrlRepository {

private final Map<String, String> storage = new HashMap<>();
private int sequence = 1;

public int nextId() {
return sequence++;
}

public void save(String shortUrl, String originalUrl) {
storage.put(shortUrl, originalUrl);
}

public String findByShortUrl(String shortUrl) {
return storage.get(shortUrl);
}
}
19 changes: 19 additions & 0 deletions src/shorturl/service/Base62Converter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package shorturl.service;

public class Base62Converter {

private static final String BASE62 =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

public String encode(int id) {
StringBuilder shortUrl = new StringBuilder();

while (id > 0) {
int index = id % 62;
shortUrl.append(BASE62.charAt(index));
id /= 62;
}

return shortUrl.reverse().toString();
}
}
41 changes: 41 additions & 0 deletions src/shorturl/service/ShortUrlService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package shorturl.service;

import shorturl.repository.ShortUrlRepository;

public class ShortUrlService {

private static final String BASE_URL = "https://short-url.com/";

private final ShortUrlRepository repository;
private final Base62Converter converter;

public ShortUrlService(ShortUrlRepository repository,
Base62Converter converter) {
this.repository = repository;
this.converter = converter;
}

public String createShortUrl(String originalUrl) {
int id = repository.nextId();
String shortUrl = converter.encode(id);

repository.save(shortUrl, originalUrl);

return BASE_URL + shortUrl;
}

public String findOriginalUrl(String inputShortUrl) {
String shortUrl = extractShortUrl(inputShortUrl);
String originalUrl = repository.findByShortUrl(shortUrl);

if (originalUrl == null) {
throw new IllegalArgumentException("해당 URL이 없습니다.");
}

return originalUrl;
}

private String extractShortUrl(String inputShortUrl) {
return inputShortUrl.replace(BASE_URL, "");
}
}
18 changes: 18 additions & 0 deletions src/shorturl/view/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package shorturl.view;

import java.util.Scanner;

public class InputView {

private final Scanner scanner = new Scanner(System.in);

public String readOriginalUrl() {
System.out.print("원본 URL 입력 (종료: exit): ");
return scanner.nextLine();
}

public String readShortUrl() {
System.out.print("단축 URL 입력: ");
return scanner.nextLine();
}
}
12 changes: 12 additions & 0 deletions src/shorturl/view/OutputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package shorturl.view;

public class OutputView {

public void printShortUrl(String shortUrl) {
System.out.println("생성된 단축 URL: " + shortUrl);
}

public void redirectToOriginalUrl(String originalUrl) {
System.out.println("원본 URL로 리다이렉트: " + originalUrl);
}
}