-
Notifications
You must be signed in to change notification settings - Fork 0
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
Feat/verify 관리자 페이지 비밀번호 입력 페이지 #18
base: develop
Are you sure you want to change the base?
Changes from 7 commits
5448416
725a37f
e520b01
fb93263
5d17d0b
e1068a3
1c80ed8
7f2ca8f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,7 +1,127 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import React from 'react'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import Header from '@src/components/common/Header'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import React, { useState, useEffect } from 'react'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import Image from 'next/image'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import verifyPlanet from '@assets/verify_planet.svg'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import styled from '@emotion/styled'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import RoundButton from '@src/components/common/RoundButton'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import UnderlinedButton from '@src/components/common/UnderlinedButton'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { flexColumnCenter } from '@src/lib/style/mixin'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { useRouter } from 'next/router'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import Input from '@src/components/common/Input'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import ToastMessage from '@src/components/common/ToastMessage'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { PW_MINLENGTH, TOAST_DELAY } from '@src/constants'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import useInput from '@src/hooks/useInput'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function verify() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return <div>verify</div>; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const router = useRouter(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const [isWrong, setIsWrong] = useState(false); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const [password, setPassword, onChange] = useInput<string>(''); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const [isDisabled, setIsDisabled] = useState(false); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const handleOnClick = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
router.push('/'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// @TODO POST 코드 작성 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setIsWrong(true); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setTimeout(() => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setIsWrong(false); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, TOAST_DELAY); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
useEffect(() => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const passwordLength = password.length; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (passwordLength < PW_MINLENGTH) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setIsDisabled(true); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setIsDisabled(false); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, [password]); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Header /> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Styled.Main> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Styled.ImageSection> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Image src={verifyPlanet} alt="관리자 인증 페이지 행성 사진" /> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</Styled.ImageSection> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Styled.Form onSubmit={handleSubmit}> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<label htmlFor="pw-input" className="label"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
비밀번호를 입력해주세요. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</label> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Input | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id="pw-input" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type="number" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
placeholder="ex.0000" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
value={password} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
align="middle" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onChange={onChange} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
maxLength={4} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</Styled.Form> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<UnderlinedButton handleClick={handleSubmit} disabled={isDisabled}> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
확인 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</UnderlinedButton> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 생각해보니까 이게 좀 애매하네 ㅋㅋ There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 맞아,, 이벤트 두 번 동작하는데 버튼 클릭할 때에도 submit이 되어야해서 이렇게 썼었어 .. 흠 더 좋은 방법이 뭐가 있을까? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
Form안에 Button을 넣고, Button에서 onClick을 없애봤는데. 이렇게 쓰면 어색한가? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 오호 그게 더 좋을 거 같다 !!!!! |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<Styled.CreatePlanet> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<p className="additional-text"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
우주의 주인이 아니신가요? <br /> 나만의 우주를 만들어보세요. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</p> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<RoundButton handleClick={handleOnClick}>우주 생성하러 가기</RoundButton> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{isWrong && ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<ToastMessage> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
틀린 비밀번호입니다. <br /> 다시 입력해주세요. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</ToastMessage> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
)} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</Styled.CreatePlanet> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</Styled.Main> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
</> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export default verify; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const Styled = { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Main: styled.main` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
width: 80vw; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
max-width: 500px; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
color: white; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
margin-top: 4.84vh; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이거 무슨 의미에염? 4.84 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 헤더와 Main 섹션 사이의 간격을 세로 반응형으로 주고 싶어서 vh단위를 썼습니다 ! 저 수치는 임의로 지정했어요 ... There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 음,, 지금 ㅋㅋ 셋다 스타일하는게 달라서 조금 걱정이네요. 어떻게 하면 좋을지...~ There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @euijinkk ㅋ ㅋ 그건 일단 갈긴 이후에 마지막에 통일할까욤 ? |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
${flexColumnCenter}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@media (max-width: 767px) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
max-width: 400px; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
`, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ImageSection: styled.section` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
margin-bottom: 4.84vh; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
width: 100%; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
& * { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이거 Image 태그 하나 말하는거죵? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 네넵 ! 근데 이 테그 안에 무엇이 들어가더라도 width 100%는 유지되어야 할 것 같아서 전체 선택자를 사용했습니다 ..! |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
width: 100%; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
`, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Form: styled.form` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
${flexColumnCenter}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
font-size: 15px; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
width: 75%; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.label { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
margin-bottom: 2.96vh; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
margin-bottom: 4.84vh; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@media (max-width: 315px) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
font-size: 13px; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
`, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
CreatePlanet: styled.section` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
width: 75%; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
${flexColumnCenter}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
margin-top: 11.25vh; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
font-size: 15px; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
.additional-text { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 클래스로 하지 말고 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 오호 ! 혹시 & > p로 하는 걸 추천하는 이유가 있나요 ? 클래스 이름으로 스타일링 하는 편이 스타일 코드를 보았을 때 더 직관적으로 파악하기 쉽다고 생각해서요 ! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Styled-component는 no-class를 지향하여, 난수로 class name을 지정해주는 것이 특징이라고 생각합니다. 그러므로 class를 쓰는 것을 지양하고, & > p 와 같은 형태로 쓰거나 다른 스타일드 컴포넌트를 정의하는 방식으로 사용하는 것이 적절하다고 생각했습니다! |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
margin-bottom: 3.59vh; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
line-height: 200%; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@media (max-width: 767px) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
line-height: 150%; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@media (max-width: 315px) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
font-size: 13px; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
`, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
import React, { ChangeEvent, InputHTMLAttributes } from 'react'; | ||
import styled from '@emotion/styled'; | ||
|
||
type Align = 'left' | 'middle'; | ||
|
||
interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'maxLength'> { | ||
className?: string; | ||
align: Align; | ||
valid?: boolean; | ||
maxLength?: number; | ||
[key: string]: any; | ||
} | ||
function Input({ className, align, valid = true, maxLength, onChange, ...props }: InputProps) { | ||
const handleChangeWithMaxLength = (e: ChangeEvent<HTMLInputElement>) => { | ||
if (String(e.target.value).length <= maxLength && typeof e.target.valueAsNumber === 'number') { | ||
onChange(e); | ||
} | ||
}; | ||
|
||
return ( | ||
<> | ||
<Styled.Input | ||
className={className} | ||
align={align} | ||
valid={valid} | ||
onChange={maxLength ? handleChangeWithMaxLength : onChange} | ||
{...props} | ||
/> | ||
</> | ||
); | ||
} | ||
|
||
export default Input; | ||
|
||
const Styled = { | ||
Input: styled.input<InputProps>` | ||
display: block; | ||
background: transparent; | ||
outline: 0; | ||
border: 0; | ||
width: 100%; | ||
border-bottom: 1px solid #565656; | ||
padding-bottom: 10px; | ||
color: #565656; | ||
&:focus { | ||
color: white; | ||
border-bottom: ${({ valid }) => (valid ? '1px solid #FFFFFF' : '1px solid #ffc5c5')}; | ||
} | ||
text-align: ${({ align }) => (align === 'middle' ? 'center' : 'left')}; | ||
&::placeholder { | ||
color: #565656; | ||
} | ||
`, | ||
}; |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,7 +4,9 @@ import React from 'react'; | |
|
||
interface ButtonProps { | ||
children: string; | ||
handleClick?: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void; | ||
handleClick?: ( | ||
e: React.MouseEvent<HTMLButtonElement, MouseEvent> | React.FormEvent<HTMLFormElement>, | ||
) => void; | ||
Comment on lines
+7
to
+9
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 조아욤 |
||
[key: string]: any; | ||
} | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,6 @@ | ||
const TOAST_DELAY = 3000; | ||
|
||
const PW_DIGIT = 4; | ||
const PW_MINLENGTH = 1; | ||
|
||
export { TOAST_DELAY, PW_DIGIT }; | ||
export { TOAST_DELAY, PW_DIGIT, PW_MINLENGTH }; |
This file was deleted.
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,13 @@ | ||||||
import { useState, useCallback, ChangeEvent, Dispatch, SetStateAction } from 'react'; | ||||||
|
||||||
const useInput = <T>( | ||||||
inputValue: T, | ||||||
): [T, Dispatch<SetStateAction<T>>, (e?: ChangeEvent<HTMLInputElement>) => void] => { | ||||||
const [value, setValue] = useState<typeof inputValue>(inputValue); | ||||||
const onChnage = useCallback((e) => { | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 오타발견 온츠나지
Suggested change
|
||||||
setValue(e.target.value); | ||||||
}, []); | ||||||
return [value, setValue, onChnage]; | ||||||
}; | ||||||
|
||||||
export default useInput; | ||||||
Comment on lines
+3
to
+13
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 굿굿, 나도 써야징 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이거 대문자로 하기로 했었던거맞죵??
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
pages 안에선 그대로 라우팅 되니까 소문자로 하기로 했었어요 !!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아하 그렇군요.. 저는 고쳐야겠네욤 ㅋㄷ