[메모장 프로젝트] 트러블슈팅 모음

728x90

나만의 메모장 프로젝트 - 트러블슈팅

로그인 vs 게스트 세션 관리

문제

  • 로그인한 사용자와 로그인하지 않은 사용자를 모두 지원해야 하는 게 목표였는데,
  • 세션에서 사용자 정보를 꺼내는 방식을 고민하게 되었다.

해결

  • 로그인 시: session.setAttribute("loginMemberId", loginMember.getId());
  • 게스트 진입 시: session.setAttribute("guestId", UUID.randomUUID().toString());
  • 메모 저장 시: 두 값 중 존재하는 값을 기준으로 writerId 식별 후 저장

 


 

유효성 검사 메시지 미출력

문제

  • @NotBlank 등 유효성 검사가 동작했지만, 타임리프에서 메시지가 보이지 않았다.

해결

  • @GetMapping 에서도 @ModelAttribute 를 사용해 폼 객체를 명시적으로 초기화
  • th:object , th:field , th:errors 의 매핑이 올바른지 확인
@GetMapping
public String loginForm(@ModelAttribute LoginForm form) {
    return "login/login";
}

 


 

로그인 실패 메시지 출력 안 됨

문제

  • 로그인 실패 시 사용자에게 피드백이 없어 사용자가 로그인에 실패했는지 결과를 알 수 없었다.

해결

  • bindingResult.reject() 를 사용해 글로벌 에러 메시지를 추가
if (loginMember == null) {
    bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다.");
    return "login/login";
}
  • 뷰에서는 th:if="${#fields.hasGlobalErrors()}" , th:errors="\*{global}" 로 출력

 


 

메모 소유자 식별 문제

문제

  • 로그인 사용자와 게스트 사용자의 메모가 섞여 표시되어 모든 `memo` 가 불러와졌다.

해결

  • Memo 객체에 String writerId 필드 추가 (loginId 또는 guestId 저장)
  • 세션에서 writerId 를 가져와 저장 및 조회 시 필터링

 


 

회원가입 시 중복 아이디 허용됨

문제

  • 동일한 loginId 로 여러 계정이 가입 가능하여 문제가 발생했다.

해결

  • 저장 전 loginId 중복 체크
if (memberRepository.findByLoginId(form.getLoginId()).isPresent()) {
    bindingResult.rejectValue("loginId", "duplicate", "이미 존재하는 아이디입니다.");
}

 


 

유효성 검사 실패 시 목록 유지 안 됨

문제

  • 메모 저장 중 유효성 검사 실패 시 기존 메모 목록이 사라지는 현상이 발생했다.

해결

  • bindingResult.hasErrors() 시 목록 재조회 후 모델에 추가
if (bindingResult.hasErrors()) {
    model.addAttribute("memos", memoRepository.getAll());
    return "memo/memo";
}

 


 

세션 키 통합 고민

문제

  • loginMemberId , guestId 를 각각 관리하자니 처리 코드가 복잡해졌다.

해결

  • writerId 는 문자열이므로 UUID 또는 loginId 를 저장할 수 있음
String writerId = (loginMemberId != null) ? String.valueOf(loginMemberId) : guestId;

 


 

Spring Boot 프로파일 적용 문제

문제

  • @ActiveProfile("test") 설정이 작동하지 않음

해결

  • @ActiveProfile 은 테스트에서만 작동, 로컬/운영 환경은 spring.profiles.active 사용한다는 것을 알게 됨
  • application-{profile}.properties 파일 생성 및 적용
  • 예: spring.profiles.active=local/application-local.properties, spring.profiles.active=prod/application- prod .properties

 


 

H2 → PostgreSQL 변경 이슈

문제

  • H2 에서 PostgreSQL 로 전환 시 JDBC 오류 발생

해결

  • PostgreSQL JDBC URL 형식 확인
jdbc:postgresql://localhost:5432/local_db
  • PostgreSQL 드라이버 명시
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

 


 

배포 환경 vs 로컬 환경 설정 분리

문제

  • 배포는 환경 변수로 설정, 로컬은 직접 설정 필요

해결

  • 로컬은 .env 또는`application-local.properties`
  • 배포는 DATABASE\_URL DB\_PASSWORD DB\_USERNAME 환경 변수 사용

 


 

728x90