JWT의 구조:
구현 클래스 및 설정:
JwtProvider: JWT의 생성(create), 유효성 검증(validate), 정보 추출(parse)을 담당하는 핵심 클래스입니다.JwtProperties: application.yml에 정의된 JWT 관련 설정(비밀 키, 만료 시간 등)을 객체로 바인딩하여 관리하는 클래스입니다. (@ConfigurationProperties)build.gradle: JWT 라이브러리(io.jsonwebtoken:jjwt-api, jjwt-impl, jjwt-jackson) 의존성을 추가했습니다.application.yml: 외부에 노출되면 안 되는 JWT 비밀 키와 토큰 만료 시간을 설정했습니다.AuthResponse (DTO): 로그인 성공 시 클라이언트에게 전달할 응답 데이터를 담는 DTO입니다. 생성된 accessToken을 포함합니다.UserService & AuthController 수정:UserService의 authenticate 메서드는 인증 성공 후 사용자 정보를 반환합니다.AuthController는 반환된 사용자 정보를 기반으로 JwtProvider를 통해 JWT를 생성하고, 이를 AuthResponse에 담아 클라이언트에게 전달합니다.PageController 및 뷰 파일 추가:PageController를 추가했습니다./, /login, /signup 등의 경로 요청 시 각각 index.html, login.html, signup.html을 반환하도록 매핑했습니다.JavaScript 코드의 재사용성과 유지보수성을 높이기 위해 ES6 모듈 시스템을 도입했습니다. 이를 통해 기능별로 파일을 분리하고 import/export 구문을 사용하여 의존성을 관리합니다.
type="module": <script> 태그에 type="module" 속성을 추가하여 브라우저가 해당 파일을 모듈로 인식하게 했습니다.
페이지별 동적 로딩(Dynamic Import):
App.js: 모든 페이지의 진입점 역할을 하는 메인 스크립트입니다. 현재 페이지의 URL을 확인하여 해당 페이지에 필요한 JS 모듈만 동적으로 불러옵니다.import() 함수: import()는 Promise를 반환하는 함수로, 필요할 때 모듈을 비동기적으로 로드합니다. 이를 통해 초기 페이지 로딩 시 모든 JS를 한 번에 불러오지 않고, 필요한 모듈만 가져와 초기 로딩 성능을 최적화할 수 있습니다. (코드 스플리팅)// App.js 예시
document.addEventListener('DOMContentLoaded', () => {
const page = getCurrentPage(); // 현재 페이지 식별 (e.g., 'signup')
// 동적 import를 사용하여 페이지에 맞는 모듈 로드
import(`./pages/${page}.js`)
.then(module => {
if (module.init) {
module.init(); // 모듈의 초기화 함수 실행
}
})
.catch(err => console.error(`${page}.js 로드 실패:`, err));
});