목록프로그래밍 (409)
쌓고 쌓다
서블릿은 2가지 방식으로 예외 처리를한다. Exception(예외) response.sendError(HTTP 상태 코드, 오류 메시지) WAS 구조는 다음과 같이 볼 수 있다. 디스패처 서블릿이 서블릿 컨테이너와 스프링 컨테이너의 연결 짓는다. 1. Exception 자바 직접 실행 자바 메인 메서드를 실행하여 main이라는 이름의 쓰레드를 실행한다. 실행중 예외를 잡지 못해 Main 메서드를 넘어서 예외가 나오면 예외 정보가 나오고 쓰레드는 종료된다. 웹 애플리케이션 웹 애플리케이션에서는 사용자 요청별로 별도의 쓰레드가 할당되고, 서블릿 컨테이너 안에서 동작한다. 애플리케이션에서 try catch로 예외를 잡지 못하고 서블릿 밖인 WAS까지 예외가 넘어오게 되며 예외 페이지를 보이게 된다. 예외 발생..
로그인하지 않은 유저가 게시글 작성을 시도하는 경우, 게시글 작성 컨트롤러를 호출하지 못하게 해보자. 먼저, 스프링 인터셉터의 흐름을 보자. HTTP 요청 -> WAS -> 필터 -> 서블릿(디스패처 서블릿) -> 스프링 인터셉터 -> 컨트롤러 스프링 MVC의 시작점이 디스패처 서블릿이고 스프링 인터셉터 또한 스프링 MVC의 기술이기에 디스패처 서블릿 이후에 사용된다. 스프링 인터셉터를 통해 사용자의 요청을 제한할 수 있는데. 로그인 유저와 비 로그인 유저의 요청이 어떻게 처리 되는지 보자. 1. 로그인 사용자 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러 2. 비 로그인 사용자 HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 (적절한 요청이..
Ajax로 서버에 데이터를 전송하는 코드이다. let memos = []; let selectPlaces = []; $.ajax({ ... data: JSON.stringify({"content": selectPlaces, "memos": memos}), ... }) 나는 이렇게 전송한 데이터를 서버에서 아래의 형태로 같이 받길 원했다. @PostMapping("...") public String makeSchedule(@RequestBody List content, @RequestBody List memos) { ... } @RequestBody를 여러개 작성하여 받는 방법은 없다. 그래서 전달 받을 VO(Value Object)를 만들어 받는것이 올바른 방법이다. 물론 Map을 사용하여 Key, Va..
먼저 Comment, Poster, UploadFile 엔티티를 보자. Comment @Entity @Data public class Comment { ... @ManyToOne @JoinColumn(name="poster_id") private Poster poster; } Poster @Entity @Getter @Setter @ToString public class Poster { ... @ManyToOne @JoinColumn(name="writer") private Member writer; @JsonBackReference @OneToMany(mappedBy = "poster", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}) private Lis..
Lombok 사용시 이상하게 boolean isParent 필드의 getIsParent() 메서드가 생성이 안되는 것이다. @Entity @Data public class Comment { private boolean isParent; } boolean 타입인 경우 getter는 getXXX로 생성이 되는 것이 아니라. isXXX로 생성이 된다. boolean 타입은 getter를 관례상 isXXX로 작성하는 것이다. 아래와 같이 변경하여 사용해주자. Comment 컬럼명 변경 alter table comment CHANGE is_parent parent int; Comment 필드 변경 private boolean parent;
이제 카카오 로그인 도입으로 회원을 Member 클래스로 관리할 수 있게 되었다. 그럼 게시글 작성시 들어가는 작성자 정보도 Member로 바꿔보자. Poster 테이블 컬럼 변경 ALTER TABLE poster DROP writer; -- 기존 writer 필드 제거 ALTER TABLE poster ADD writer bigint; -- 외래 키를 위한 필드 생성 ALTER TABLE poster ADD FOREIGN KEY (writer) REFERENCES member(id); -- 외래 키 등록 기존 writer 필드(varchar)를 외래 키로 사용하기 위해 변경 과정이 필요하다. Poster 엔티티 변경 Poster - 변경 전 writer @Entity @Getter @Setter @To..
기존에 로그인 여부에 따라 헤더를 달리 바꾸기 위해서 Controller에서 아래와 같이 코드를 작성했다. @GetMapping("/") public String home(@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember, Model model) { if (loginMember == null) { model.addAttribute("isLogin", false); } else { model.addAttribute("isLogin", true); model.addAttribute("member", loginMember); } return "home"; } isLogin으로 로그인 여부를 관리했었다...
로그인 여부에 따라 html 파일의 일부 태그들이 변경되는 상황이다. 예를 들어 로그인하기 전에는 만 존재한다. 로그인한 후에는 위의 id="login"을 가지는 태그는 없어지고 만 가지게 된다. 그런 이유로 아래의 js 파일에서 문제가 발생했다. let loginButton = document.querySelector("#login"); let logoutButton = document.querySelector('#logout'); loginButton.addEventListener('click', () => { window.location = 'https://kauth.kakao.com' }) logoutButton.addEventListener('click', () => { window.locati..