본문 바로가기

spring boot

JPA / spring boot 기초

사용자가 form에 입력한 정보 서버로 전송하기

 

 

input 태그에 name 속성이 없으면 서버에 전송이 되지 않는다.

form action 속성엔 POST 요청할 url 경로를 적는다.

우리는 서버로 데이터를 전송할 예정이기에 POST 요청을 한다.

 

버튼은 submit 타입으로 지정해야 서버로 데이터 전송이 가능하다.

 

 

프론트단에서 url 파라미터로 보낸 데이터를 한번에 받기 위해 Map 타입을 사용했다.

받은 데이터를 toString() 을 이용해 확인

 

itemRepository.save()의 조건은 해당 리포지토리 클래스타입의 오브젝트를 넣어줘야 한다.

그렇기에 formData.get("데이터이름")에 알맞은 형변환을 넣어줘 DB로의 전송 또한 마무리 짓는다.

 

 

@ModelAttribute

 

위에선 Map으로 받아온 데이터들을 직접 형변환을 해주고 넘길 클래스타입에 직접 저장해 디비로 전송했다면

@ModelAttribute ClassName name 을 사용하면 서버에 도착한 순간부터 해당 Class 타입으로 받아올 수 있다.

 

 

타임리프 html UI 재사용

 

 

재사용할 코드를 templates 폴더에 빼두고 th:fragment="이름"

가져다 쓸 파일에 위 형식처럼 작성

(tiles와 비슷)

 

replace 문법에선 ::navbar(data1, data2..) 이런 식으로 데이터 바인딩 가능

 

 

 

/detail/{id}

url 파라미터를 사용하면 {id}란에 어떤 아이디가 와도 해당 페이지를 보여줌

 

Optional<Type>

해당 변수가 <>안의 타입일 수도 있고 비어있을 수도 있다.

(JPA에서 findById 와 같은 메소드 사용시 약속된 받을 데이터 타입)

 

위의 코드에서 result.get(); 을 쓰면 Optional[] 괄호가 벗겨진다.

하지만 Optional은 값이 비어있을 수도 있기 때문에 if문으로 값이 null이 아니라면 이라는 조건을 붙여주는게 안전하다.

 

 

result 안에 값이 null이 아니라면 .isPresent();

 

 

@PathVariable

 

url에 변수를 담아 get, post 요청을 할 때 사용한다.

 

사용법 : @PathVariable Long id

 

 

@PathVariable을 사용해 뷰단에서 id 값을 전달해주면 컨트롤러에서 id에 저장해 안의 코드를 실행한다.

 

 

예외처리

 

에러가 날 수 있는 코드가 있다면 try catch로 감싸 시도를 하고 에러가 나면 catch문의 코드를 실행한다.

 

 

ExceptionHandler를 사용하면 해당 클래스 내의 모든 익셉션들을 이 코드에서 처리할 수 있다.

하지만 해당 프로젝트에 컨트롤러가 많다면 아래 방법이 있다.

 

 

클래스를 하나 생성하고 @ControllerAdvice 어노테이션을 붙인다.

그 후, 안의 코드를 작성하면 모든 컨트롤러에 대한 익셉션을 해당 클래스에서 관리할 수 있다.