목록프로그래밍 (408)
쌓고 쌓다
JPA는 프록시라는 기술을 사용한다. 프록시를 사용하면 연관된 객체를 처음부터 DB에서 조회하는것이 아니라, 실제 사용 시점에서 DB 조회를 한다. ( 자주 함께 사용하는 객체라면 두번 조회하는것보다 첨부터 조인 쿼리를 날리는게 효과적이다. ) 먼저. 회원, 팀 엔티티, 테이블 상황을 보자. Member @Entity @Getter @Setter @NoArgsConstructor public class Member { @Id private Long id; private String username; @ManyToOne @JoinColumn(name="team_id") private Team team; } Team @Entity @Getter @Setter @NoArgsConstructor public c..
문제 발생! 먼저 가상으로 발생한 문제를 보자. @PostMapping("add") public String addItem(@ModelAttribute Item item) { itemRepository.save(item); return "basic/item"; } 폼 데이터와 함께 POST 요청이 들어왔다. 이 item을 저장하고 Model에 item을 담아 상품 상세 페이지를 보여준다. 이때 내부호출로. Model에 담아 렌더링하여 보여주는 방식이라 URL은 그대로 유지된다. 여기서 새로고침을 반복하면 상품이 계속적으로 추가되어 상품ID가 증가하는 모습이 보인다. 위의 addItem 메서드에 문제가 있는것이다. 상품 폼을 작성하고 POST 요청을 보냈다. 그리고 서버 내부호출로 렌더링된 상품 상세 페이..
다중 게시판을 만드는 방법으로 두가지가 가능할 것 같다. 하나의 테이블로 게시판 구분 컬럼 추가 게시판 유형별로 테이블 생성 다음에 테이블을 나눠보기로하고... 현재 게시판의 유형별로 컬럼이 다르지 않아 한 테이블에서 구분 컬럼으로 구분하게 만들어 봤다. 게시글 테이블 category 컬럼 추가 alter table poster add category VARCHAR(255); Category Enum // 추후에 @Convert로 리팩토링해보자. public enum Category { QUESTION, // 질문 FREE } String으로 게시판 유형을 구분하는것보다 자바 Enum 타입으로 구분해보자. Enum을 사용함으로써 값을 정해둠으로써 오타 문제를 해결할 수 있고 가독성도 좋고 값의 제한을 둘..
HTTP 메시지 바디를 읽거나 쓰는경우 "HTTP 메시지 컨버터"가 동작한다. 예를 들어 @ResponseBody를 사용하여 "hello"를 리턴했다고 하자. 이 어노테이션은 메시지 바디에 "hello"를 그대로 넣을 수 있는 어노테이션이다. 이때 뷰 리졸버는 동작하지 않고 "HTTP 메시지 컨버터"가 동작한다. 언제 "HTTP 메시지 컨버터"가 동작할까? (Spring MVC에서) 요청 : @RequestBody, HttpEntity(또는 RequestEntity) 응답 : @ResponseBody, HttpEntity(또는 ResponseEntity) 어떤 "HTTP 메시지 컨버터"가 동작할까? 위의 그림에서 정확히는 "StringHttpMessageConverter"가 사용된다. 이렇게 다양한 메시..
요청 파라미터를 처리하는 @RequestParam, @ModelAttribute와 다르게 HTTP 메시지 바디에 직접 데이터가 담겨오는경우 어떻게 처리해야할까? 이떄는 요청 파라미터 방식인 @RequestParam, @ModelAttribute로 처리할 수 없다. (HTML Form 형식으로 오는것은 요청 파라미터로 처리한다.) 단순 텍스트 받기 차근차근 스프링을 사용해보자. 먼저 서블릿을 사용하여 처리해보자. @PostMapping("/request-body-string-v1") public void requestBodyString(HttpServletRequest request, HttpServletResponse response) throws IOException { ServletInputStrea..
예를 들어, 회원 객체를 만들기 위해 요청 파라미터로 필드 값을 받아 객체를 초기화하는 과정을 거친다. 먼저 HelloData 클래스를 보자. HelloData @Data public class HelloData { private String username; private int age; } @Data에는 Getter,Setter, toString 등 존재하여 편하게 사용할 수 있다. 요청 파라미터로 들어온 이름, 나이를 객체를 생성하여 값을 넣어주는 과정을 거친다. @ResponseBody @RequestMapping("/model-attribute-v1") public String modelAttributeV1(@RequestParam String username, @RequestParam int ..
먼저 게시글 수정 클릭시 첨부파일 수정 내용에 관한 처리를 어떻게했는지 이야기를 하자면 게시글 수정 html에서 해당 게시글의 파일 정보들을 가져온다. 파일 정보들을 첨부 파일 목록에 출력(load)한다. 첨부 파일 목록에 기존 파일 출력(load) 옆에 삭제버튼에 클릭 이벤트로 아래의 태그를 생성한다. 이 태그를 통해서 서버 POST 요청에 deleteFilesId를 바인딩하여 해당 PK를 삭제하는 과정을 거칠 것이다. 추가로 첨부 파일에 넣는 파일들을 서버에서 List로 처리한다. 1. 해당 게시글의 파일 정보 API @RestController public class UploadFileController { ... @GetMapping("/files/{posterId}") public List fi..
클라이언트에서 서버로 데이터를 전달할 때 다음과 같은 방법이 있다. 1. GET 쿼리 파라미터 /url?username=LSM&age=7 바디 없이 URL의 쿼리 파라미터에 데이터를 포함해 전달하는 방법이다. 2. POST (HTML Form) html의 form 태그를 통해 데이터를 전송. content-type: application/x-www-form-urlencoded (폼으로 전송시 타입) 메시지 바디에 쿼리 파라미터 형식으로 전달한다. ( /url?username=LSM&age=7 ) @RequestParam - HTTP 요청 파라미터 @RequestParam을 통해서 HTTP 요청 데이터를 처리할 수 있다. html form input 태그의 name 속성 값으로 서버에서 파라미터로 받아 처..