한바다
타임리프 실행 오류 본문
✅ 타임리프 실행오류 미안해 오해해서 오늘은 제목이다
코드가 적용된 회원가입 html파일이 스프링부트를 통해 프론트에서 정상 실행이 되었는데
DB연결을 위해 html파일 인풋태그와 폼태그에 타임리프 문법을 적용 후 아래와 같은 오류가
발생하였다.
Wed Jun 26 14:39:27 KST 2024
There was an unexpected error (type=Internal Server Error, status=500).
An error happened during template parsing (template: "class path resource [templates/index.htm]")
org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/index.html]")
에러가 발생한 페이지를 찾기 위해 작성한 로직을 먼저 확인하였다
프론트에서는 정상 실행 되었기에 두번째로 진행했더 작업의 순서는 html에 타임리프 문법 적용, sql문을 작성할 xml마이베티스, 데이터로 연결할 변수를 작성해줄 dto, 기능이 탑재되어 있는 서비스, db와 html을 연결할
컨트롤러 어느페이지에서 오류가 발생되었는지 하나하나 체크 해 보았다.
505오류가 뜬걸로 보아 컨트롤러에 작성이 잘못 된 것인지 html 작성내용을 모두 지우고 'aaa'라고 입력시
서버에 'aaa'라고 정상 작동이 되었다. 그리고 html코드에서 타임리프 문법이 적용된 코드를 모두 지우고
실행시 화면에 이상이 없었다.
현재 내가 가진 개발지식으로선 다른 부분이 눈에 들어오지 않아 타임리프문법에 오류가 있다고 판단하여
타임리프 문을 분석 했다.
<form th:action="@{/register}" method="post" th:object="${mem}" autocomplete="off">
<h1>회원가입</h1>
<div class="sign-form">
<div class="input-group">
<input type="text" th:field="*{member_id}" id="userId"
placeholder="아이디를 입력하세요(영어대소문자+숫자6~12)" required /> <span
id="msg1"></span>
</div>
<br>
<div class="input-group">
<input type="password" th:field="*{member_pw}" id="userPw"
위 폼구문에 th:object="${mem}" 모두 적용되는 것으로 중간에 비밀번호 확인 인풋은 적용되지 않아도
된다고 생각하여 th:object를 삭제 후 "${mem.memberId}" 작성 하였고,
application.properties환경설정에 작성한 mappers와 탬플릿 아래 mapper폴더 스팰링이 다른 것을 수정하였다.
자, 이제 되겠지 하고 런 에즈 실행 시 동일한 오류 발생으로 원인을 찾을 수가 었었다.
데이터 연결은 추후 하고 우선 타임리프가 적용된 앞단을 보고 싶었는데 계속되는 오류를 내가 아는 선에선 찾을
수 가 없었다. 오류를 계속 찾으려고 하면서 뭔가 자신이 생기는건 내가 현재 모든 오류를 다 볼 수 없다는 것. 아직 눈이 째메나다는 것, 그래서 날 구박하지 않고 내가 찾을 수 있는 최선의 방법으로 찾았는지 "진화야 최선을 다했어? " 라는 질문에 대답할 수 있는게 목표였다. 위까지 찾아본 후 함께 공부하는 친구들, 선생님에게 문의를 해보았다.
따라서 아래와 같이 오류의 답을 찾을 수 있었다. 근본적 원인은 타임리프를 작성하면서 변수명을 제대로 작성하지 않고
데이터베이스에 접속을 해보지 않았다는 것이다!! 중요한것은 데이터 베이스 연결 이였다!!!
✔️우선 sql문을 작성한 xml mybatis에 insert문에 변수명이 sql에 생성한 테이블과 상이했다.
테이블명도 맞지 않았고, 변수명도 틀렸다. 또한 자료형도 맞지 않았으니 .... sql 미안해. 널 간과 했구나..
SQL 테이블명과 컬럼명은 아래와 같다.테이블명 MEMBERS
MEMBER_NO
MEMBER_ID
MEMBER_PW
MEMBER_NICKNAME
MEMBER_EMAIL
MEMBER_NAME
MEMBER_SSN
MEMBER_PHONE
MEMBER_ADDRESS총 9개의 컬럼으로 맨 위 자동으로 번호가 부여되는 시퀀스를 제외후 8개의 항목은 필수 항목이였다.따라서 아래와 같이 수정 작업을 시작 했다
✔️문제를 파악했으니 잘못된 변수명의 집들을 찾아가 고쳐주어야 했다
첫번째 방문한 집은 MemberMapper.xml 집~ 똑똑똑 집수리 하러 왔어요 문좀 열어주세요~~
인절트문을 살짝(사실은 모두)수정하고 갈께요!!
INSERT INTO MEMBERS(member_no,member_id,member_pw,member_nickname,member_email,member_name,member_ssn,member_phone,member_address)
VALUES (member_seq.NEXTVAL,#{member_id},#{member_pw},#{member_nickname},#{member_email},#{member_name},#{member_ssn},#{member_phone},#{member_address})
두번째 방문집 dto 똑똑똑~ 에구구 여기는 변수명도 지멋대로 게터세터 롬북도 해주지 않았구나~
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Member {
private int member_no;
private String member_id;
private String member_pw;
private String member_nickname;
private String member_email;
private String member_name;
private String member_ssn;
private String member_phone;
private String member_address;
두번째 집에서 중요한것은 데이터베이스와 자료형을 맞춰줘야 한다 데이터 베이스에 VARCHAR2이면 자바에는 String으로 적어줘야 데이터 값이 맞는다
세번째 집 방문 똑똑똑~
우선미안하단 애길 먼저 할께. 타임리프문법 오류가 아니였는데 괜한 오해를 했구나... 변수명만 고쳐주고 갈께
나는html페이지에 제이쿼리 작동을 하기 위해 id를 적어놔서 타임리프문과 연결된 th:field문만 수정해주었다.
이를 테면 th:field="*{member_id}" th:field="*{member_pw}" 또한 알게된 사실이 비밀번호 확인은 타임리프 구문을
적용하지 않아도 데이터 베이스 연결하는데 아무런 이상이 없다는것 나이 거 꽤 고민 했다고 혹 무슨일 생길까 끙끙...
세번째 집 까지 모두 방문한 후에 타임리프가 적용된 백단까지 무사히 정상 작동할 수 있었고
insert문의 수행되어 데이터베이스에 값이 정상적으로 들어갔다. 물론 중복가입 설정은 아직 능력 밖이라 해주지 못했고
또 금일 배운 이메일 인증은 아직 완성시키지 못했다. 이제 이메일인증까지 완성시키로 가보자 고고고~~~
'스프링부트' 카테고리의 다른 글
[스프링부트]build.gradle , Failed to configure a DataSource오류 (0) | 2024.08.26 |
---|---|
스프링부트 흐름 과 이해 그리고 중복확인에러 (0) | 2024.07.09 |
깃명령어와 React 시작! (0) | 2024.07.03 |
git hub 연결 오류 해결 (0) | 2024.07.01 |