Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[5기 조인수] Shorten URL 과제 PR입니다. #71

Open
wants to merge 42 commits into
base: ZZAMBAs
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 31 commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
8a638f9
Initial commit
ZZAMBAs Dec 12, 2023
476b930
Feat: short url에 대한 도메인 클래스와 스키마를 추가한다.
ZZAMBAs Dec 13, 2023
7ddf83f
Feat: ShortUrlRepository를 추가한다.
ZZAMBAs Dec 13, 2023
f545f35
Feat: int 값을 6자리 BASE62 문자열로 인코딩하는 UrlTransformer를 추가한다.
ZZAMBAs Dec 13, 2023
9e9b702
Feat: ShortUrl에 빌더 패턴을 추가한다.
ZZAMBAs Dec 13, 2023
c9891ae
Feat: UrlTransformer를 인터페이스 형식으로 변경하고 BASE62 기반 구현체를 추가한다.
ZZAMBAs Dec 13, 2023
ee7e781
Feat: Url 처리 관련 예외, 에러코드 클래스를 추가한다.
ZZAMBAs Dec 14, 2023
77d1b9e
Chore: MySQL을 사용하도록 빌드 파일과 yml 파일의 내용을 수정한다.
ZZAMBAs Dec 14, 2023
960b602
Fix: 일부 잘못된 환경 설정, visitCount를 더하는 쿼리를 제대로 수정한다.
ZZAMBAs Dec 14, 2023
6b261f9
Feat: 코드를 가독성 좋게 수정하고 ShortUrl에서 방문 카운트를 올리는 메서드를 추가한다.
ZZAMBAs Dec 15, 2023
7643d3c
Feat: URL 저장, 가져오기를 구현한 서비스를 추가한다.
ZZAMBAs Dec 15, 2023
41e8704
Test: 테스트용 yml 파일을 생성한다.
ZZAMBAs Dec 15, 2023
c26e7e5
Fix: 랜덤 정수가 음수가 되지 않도록 수정한다.
ZZAMBAs Dec 15, 2023
7d638e7
Feat: null은 쿼리에 포함시키지 않도록 하고 originalUrl에 getter를 추가한다.
ZZAMBAs Dec 15, 2023
9172394
Test: shortUrlService의 기능을 테스트하는 코드를 추가한다.
ZZAMBAs Dec 15, 2023
2b83465
Feat: saveOriginalUrl()에서 이미 저장된 original Url은 바로 반환하도록 한다.
ZZAMBAs Dec 15, 2023
4f9300b
Test: 이미 저장된 url에 대해 같은 url을 반환하는 테스트를 추가한다.
ZZAMBAs Dec 15, 2023
2853a6d
Rename: 패키지를 세분화한다.
ZZAMBAs Dec 15, 2023
027c909
Feat: 최초 페이지를 생성한다.
ZZAMBAs Dec 16, 2023
b41f1de
Feat: 빠른 탐색을 위해 인덱싱을 추가한다.
ZZAMBAs Dec 17, 2023
9970d68
Feat: DTO를 추가하고 적용한다.
ZZAMBAs Dec 17, 2023
d069253
Test: DTO에 맞게 테스트 코드를 수정하고, short url 방문 시 업데이트 되는지 확인하는 테스트를 추가한다.
ZZAMBAs Dec 17, 2023
c0c134c
Feat: 변환 URL을 보여주는 페이지를 추가한다.
ZZAMBAs Dec 17, 2023
df62215
Feat: ShortUrl 관련 공통 상수를 관리하는 클래스를 추가한다.
ZZAMBAs Dec 17, 2023
9dc80e2
Feat: ShortUrl 관련 공통 메서드를 관리하는 클래스를 추가한다.
ZZAMBAs Dec 17, 2023
da170d3
Feat: HTTP 프로토콜을 제거하여 DB 저장 공간을 절약한다.
ZZAMBAs Dec 17, 2023
1093c0c
Feat: favicon.ico를 불러오지 않도록 하는 MVC 설정을 추가한다.
ZZAMBAs Dec 17, 2023
e51224f
Feat: ShortUrl 처리 컨트롤러를 추가한다.
ZZAMBAs Dec 17, 2023
7077d58
Feat: ShortUrl 복사 기능을 추가한다.
ZZAMBAs Dec 17, 2023
3853796
Feat: 잘못된 요청 혹은 서버 예외에 대한 컨트롤러 처리를 추가한다.
ZZAMBAs Dec 17, 2023
237dc39
Feat: 변환 URL 정보에 원본 URL도 나타나도록 한다.
ZZAMBAs Dec 17, 2023
2f4e65b
Feat: originalUrl을 고유하도록 컬럼 속성을 추가한다.
ZZAMBAs Dec 26, 2023
db1d232
Refactor: stream을 이용하여 간략화한다.
ZZAMBAs Jan 1, 2024
d30ee0b
feat: 예외 처리를 위한 Controller를 따로 생성한다.
ZZAMBAs Jan 1, 2024
ff371c7
Refactor: 에러 코드를 HTTP와 강결합되지 않도록 자체 코드로 수정한다.
ZZAMBAs Jan 1, 2024
9ea0a29
Refactor: BASE62의 62를 상수로 관리한다.
ZZAMBAs Jan 1, 2024
3a248f5
Chore: 상수 네이밍을 통일한다.
ZZAMBAs Jan 1, 2024
507ebba
Rename: 이미 클래스 명에 URL임이 명시되어 있기에 더 직관적인 메서드 명으로 변경한다.
ZZAMBAs Jan 1, 2024
8081b48
Chore: 일부 코드를 다듬는다.
ZZAMBAs Jan 1, 2024
817e9eb
Refactor: 메서드 내부로 랜덤 정수 만드는 로직을 포함시킨다.
ZZAMBAs Jan 1, 2024
bc3dbb5
Refactor: 리다이렉트 서버가 변경될 것을 생각해 상수화한다.
ZZAMBAs Jan 1, 2024
0a15a04
Chore: 사용하지 않는 import 문을 정리한다.
ZZAMBAs Jan 1, 2024
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
39 changes: 39 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.0'
id 'io.spring.dependency-management' version '1.1.3'
}

group = 'org.prgms'
version = '0.0.1-SNAPSHOT'

java {
sourceCompatibility = '17'
}

configurations {
compileOnly {
extendsFrom annotationProcessor
}
}

repositories {
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'com.mysql:mysql-connector-j:8.2.0'

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

런타임에만 필요해보이는데 관련해서 확인해주세요.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아무 생각 없이 implementation으로 받아오면 사실 scope 생각을 안해도 되는데 scope를 고려해야 하는 이유는 따로 있을까요?

implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
Comment on lines +32 to +33

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

테스트 시에도 롬복이 필요한가요?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ShortUrlServiceTest에서 일부 테스트 값을 출력해보기 위해 사용 했었습니다!

testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
useJUnitPlatform()
}
Empty file.
7 changes: 7 additions & 0 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
249 changes: 249 additions & 0 deletions gradlew
Original file line number Diff line number Diff line change
@@ -0,0 +1,249 @@
#!/bin/sh

#
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

##############################################################################
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################

# Attempt to set APP_HOME

# Resolve links: $0 may be a link
app_path=$0

# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done

# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum

warn () {
echo "$*"
} >&2

die () {
echo
echo "$*"
echo
exit 1
} >&2

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar


# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi

# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi

# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.

# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )

JAVACMD=$( cygpath --unix "$JAVACMD" )

# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi


# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'

# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.

set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"

# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi

# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#

eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'

exec "$JAVACMD" "$@"
92 changes: 92 additions & 0 deletions gradlew.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem

@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto execute

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar


@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*

:end
@rem End local scope for the variables with windows NT shell
if %ERRORLEVEL% equ 0 goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega
Loading