**1주차 과제**
1. 복습(웹 서버 이해)
2. 간이 로그인 페이지 만들기(DB연결X)
admin, admin1234라고 입력했을 때 로그인을 시켜주는 페이지 만들어보기
3. 로그인 페이지 이쁘게 만들기.(CSS / BootStrap)
⚙️ 기술 선택 이유와 나만의 개발 환경 구성 정리
말틱님이 강의로 가이드 준 방식 그대로 따라가기보다는,
내가 만들고 싶은 서비스의 목적과 개발 환경의 효율성을 고려해서
몇 가지 핵심 기술을 변경하거나 대체해서 사용하기로 결정했다.
말틱님의 컨펌?도 있었으니 크게 우려하진 말자.
1. Client : PHP → React (TypeScript)
🔹 APM 방식: PHP
- 서버에서 HTML을 직접 렌더링하는 방식 (전통적인 MPA)
- 비즈니스 로직도 PHP 안에서 처리됨
- 웹서버와 PHP가 서버 사이드 렌더링 구조로 밀접하게 통합
✅ 내가 선택한 기술: React (TypeScript)
- SPA(Single Page Application) 구조로, 사용자 경험이 더 부드럽고 빠름
- 컴포넌트 기반 UI로 유지보수가 용이
- 타입스크립트를 통해 코드 안정성을 확보
- 화면 개발을 더 빠르고 유연하게 할 수 있음
2. 웹서버 : Apache → Nginx
🔹 APM 방식: Apache
- 전통적인 웹서버
.php요청을 받아서 PHP 인터프리터와 연동.html,.css,.js같은 정적 파일도 서빙 가능
✅ 내가 선택한 기술: Nginx
- 정적 파일 서빙에 최적화된 경량 웹서버
- 프록시 역할, 로드밸런싱 등 현대적인 서비스 아키텍처에 더 적합
- React 앱의 정적 파일을 서빙하거나, API 요청을 프록시 처리할 때 매우 유용
- 실무에서도 Apache보다 Nginx를 더 많이 사용함
3. 가상서버 : VM → Docker
🔹 가상머신 (VMware)
- 전체 운영체제를 가상화해서 실습
- 리소스를 많이 차지하고, 설정이 복잡함 (포트 포워딩, 파일 공유 등)
- 시스템 수준에서는 실제 서버와 비슷하지만, 개발 속도가 느림
✅ 내가 선택한 기술: Docker
- 가볍고 빠르게 컨테이너로 개발 환경 구성 가능
- Dockerfile과 docker-compose.yml로 개발 환경을 코드로 관리
- 배포 환경(AWS, 클라우드)과 거의 동일한 방식으로 운영 가능
- 프론트/백엔드/DB 등을 컨테이너 단위로 독립 실행, 확장성에 매우 유리
추가 적용) UI 퀄리티 향상을 위한 선택 : Stitches
✅ Stitches (CSS-in-JS)
- 빠르고 유연한 스타일 구성 가능
- TypeScript와 강력하게 통합되어 디자인 시스템 구성과 유지보수에 유리
- 전통적인 CSS/SASS보다 컴포넌트 중심 UI 개발에 적합
1. 리엑트 개발 환경 세팅
npm create vite@latest my-project --template react-ts //프로젝트 생성
◇ Select a framework:
React
◇ Select a variant:
TypeScript + SWC
cd my-project //만들어진 디렉토리 접근
npm install //npm 설치
npm install react-router-dom //라우팅을 위한 라이브러리 설치
npm install @stitches/react //(선택사항) custome ui를 위한 라이브러리 설치
npm run dev //개발자 모드로 실행
- 위에서 my-project를 본인이 진행할 프로젝트 명으로 바꾸면 된다!
- stitches를 어떻게 쓰는지는 여기선 넘어가고 늘 그렇듯이 공식문서를 참고하거나 구글링을 하자.
- 나는 stitches를 사용하니까 필요 없는 App.css와 index.css는 삭제하고 global.ts를 만들어서 Stitches를 설정해주었다.
2. 로그인, 홈화면 개발
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
setError('');
if (loginId === 'admin' && password === 'admin1234') {
navigate('/home');
} else {
setError('잘못된 사용자 이름 또는 비밀번호입니다.');
}
};
- DB 없이 간단하게 Id와 Password를 비교하는거니 로직만 적어주었다.
- 틀린 정보를 입력할 경우 error값에 따라서 경고문구를 보일 수 있게 설정했다.
- 로그인에 성공하면 home화면으로 리디렉션된다.
- 로그인의 랜더링 화면을 그리고 홈화면의 간단한 랜더링을 그리면 된다.
3. APP 라우팅 적용
const App: React.FC = () => {
return (
<Router>
<Routes>
<Route path="/login" element={<Login />} />
<Route path="/home" element={<Home />} />
<Route path="/*" element={<Navigate to="/login" replace />} />
</Routes>
</Router>
)
}
- 기본적으로 index.html, mian.tsx, App.tsx, 순서로 접근한다.
- App.tsx에서 path에 따라서 랜더링할 컴포넌트를 지정해준다.
- 이렇게 되면 localhost:5173/login으로 접속하면 Login 컴포넌트를, localhost:5173/home으로 접속하면 Home 컴포넌트를 랜더링하게 된다. 그리고 별도로 어떤 링크로 접속하든 Login으로 가게 해두었다.
5. docker, nginx 서버 배포
- 다음주부터는 어차피 DB를 연결할 예정이기 때문에 그냥 웹서버와 Client 서버를 분리했다.
- 클라이언트용 Dockerfile을 만들고, nginx용 nginx.conf와 Dockerfile을 만들고 docker-compose.yml을 통해서 최종 배포 설정을 해주었다.
6. 결과 확인

'노말틱 모의해킹' 카테고리의 다른 글
| [2주차 과제] 로그인, 회원가입, DB 연결 (1) | 2025.04.11 |
|---|---|
| [1주차 코칭] 블로그 포스팅 주제 줍줍 (1) | 2025.04.10 |
| [1주차 강의] 3. 동적페이지 (1) | 2025.04.09 |
| [1주차 강의] 2. 웹 서버의 역할(NAT, PAT) (1) | 2025.04.08 |
| [1주차 강의] 1. 환경설정 (0) | 2025.04.08 |