전체 글

전체 글

    BOJ 15686 치킨 배달

    https://www.acmicpc.net/problem/15686 15686번: 치킨 배달 크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸 www.acmicpc.net 1. 아이디어 1. map을 돌면서 집과 치킨집의 좌표를 저장 2. 저장해둔 리스트에서 치킨 집을 M개 선택 - 중복없이 순서 상관 없이 뽑는 조합문제 2. 각 경우마다 치킨 거리를 구해 최솟값 갱신 처음에 map을 보자마자 고정관념으로 map 전체를 돌면서 완전탐색을 해야할 거라고 생각했는데 그렇게 하면 너무 복잡해진다. 어짜피 거리를 구하는 문제이기 때문에 거리 구하는 공..

    에러 수정

    에러 수정

    회원가입 시 동일한 이름일 때 발생하는 오류 기존에 존재하는 이름으로 회원가입을 시도하면 회원가입이 완료되었다는 알림창이 뜨면서 메인 화면으로 돌아온다. 하지만 콘솔을 보면 Duplicate entry라고 해서 유니크하지 않다는 에러가 발생한 것을 볼 수 있다. 모든 익셉션을 GlobalExceptionHandler가 처리하도록 코딩해두었다. 모든 에러는 500 에러가 발생하도록 한 것이다. 따라서 user.js에서 회원가입시 resp.status가 500인 경우 회원가입에 실패했다는 알림창을 띄워주면 된다! 게시물의 댓글이 있을 때 삭제가 안되는 문제 게시물의 댓글이 있을 때 삭제를 누르면 삭제가 완료되었습니다 알림창은 뜨지만 실제로는 삭제가 안된다. 에러: Cannot delete or update ..

    댓글 시스템

    댓글 시스템

    댓글 디자인 detail.jsp 등록 댓글 리스트 댓글 내용입니다!! 작성자 : cos1234 삭제 댓글 목록 뿌리기 샘플 데이터 생성 ReplyRepository.java package com.cos.blog.repository; import org.springframework.data.jpa.repository.JpaRepository; import com.cos.blog.model.Reply; public interface ReplyRepository extends JpaRepository{ } detail.jsp 댓글 리스트 ${reply.content} ${reply.user.username} 삭제 그런데 이렇게 하면 StackOverflowError 에러가 발생한다. 이유는 board를 부르면..

    카카오 로그인 구현

    카카오 로그인 구현

    카카오 로그인 환경설정 https://developers.kakao.com/ Kakao Developers 카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다. developers.kakao.com 카카오 개발자 센터에서 애플리케이션 추가 플랫폼 등록 - WEB 플랫폼 등록 - http://localhost:8080 등록 카카오 로그인 - 활성화 Redirect URI - http://localhost:8080/auth/kakao/callback 등록 동의항목 - 프로필, 이메일 카카오 로그인 OAuth2.0 개념 무한개의 홈페이지가 있을 때, 회원가입 시 각 사이트마다 따로 가입을 해줘야 한다. 실제 나라는 존재는 ..

    회원 수정

    회원 수정

    회원 수정 페이지 UserController.java @GetMapping("/user/updateForm") public String updateForm() { return "user/updateForm"; } 현재 로그인된 회원의 정보를 수정해야 하니까 그 유저의 id값을 받기 위해 updateForm에서 hidden값으로 id를 적어둔다. user/updateForm.jsp Username Password: Email 회원수정완료 user.js let index = { init: function() { ... $("#btn-update").on("click", () => { this.update(); }); }, ... update: function(){ let data = { id: $("#id"..

    게시판

    게시판

    글작성하기 로그인 후 네비게이션 바의 글쓰기 눌렀을 때 /board/saveForm으로 이동하도록 설정 BoardController.java @Controller public class BoardController { ... // USER 권한 필요 @GetMapping("/board/saveForm") public String saveFrom() { return "board/saveForm"; } } board/saveForm.jsp 글쓰기 화면 잘 연결된다. summer note 적용하기 https://summernote.org/getting-started/ board/saveForm.jsp Title Content: 글쓰기완료 js/board.js let index = { init: function..

    비밀번호 해쉬 & 시큐리티 로그인

    비밀번호 해쉬 & 시큐리티 로그인

    회원가입을 위해 ddl-auto를 create로 바꿔서 테이블을 초기화 시켜준 후 update로 다시 바꾼다. 왜냐하면 비밀번호가 해쉬화 즉, 암호화가 되어야 하기 때문이다. 회원가입을 하는데 암호화가 안되어 있으면 로그인 자체가 안되도록 시큐리티가 막아준다. 해쉬암호 비밀번호를 해쉬암호로 바꿔서 넣어야 한다. 로그인을 요청하면 시큐리티가 지켜보다가 요청을 가로채서 파라미터인 username과 password를 가져온다. 이를 이용해 내부적으로 로그인을 진행시킨다. 로그인이 완료가 되면 시큐리티 전용 세션에 유저 정보를 등록한다. 이렇게 등록을 해두면 IoC에서 유저 객체를 관리하므로 필요할 때 DI로 가져올 수 있다. 유저 정보를 시큐리티 세션에 등록할 때 User 오브젝트를 지정된 타입인 UserDe..

    스프링부트 Spring Security

    스프링부트 Spring Security

    시큐리티 시작 전 권한 문제때문에 yml에서 context-path를 지워줘야 한다. 당연히 마찬가지로 context-path를 적어줬던 모든 것들을 지워준다. Spring Security 이전에 pom.xml에서 security 관련 dependency을 주석처리했었는데 풀어준다. 이후에 메인 페이지인 http://localhost:8000에 접속하면 다음과 같이 http://localhost:8000/login으로 이동된다. 시큐리티가 우리 홈페이지 어느 곳에 접근하던지 가로채서 이 화면으로 보내버리는 것이다. 잠긴 이유는 pom.xml의 시큐리티 dependency 때문이다. 접속하려면 console창에 적힌 비밀번호를 이용해 접근해야 한다. 로그인 후 접근하면 메인페이지로 잘 이동한다. 이때부터는..

    전통적인 방식의 로그인

    1. loginform.js Username Password: Remember me 로그인 2. user.js let index = { init: function() { ... $("#btn-login").on("click", () => { // function(){} 대신 ()=>{} 사용하는 이유는 this를 바인딩하기 위해! this.login(); // save함수 이벤트로 호출 }); }, save: function(){ ... }, login: function(){ let data = { username: $("#username").val(), password: $("#password").val() }; $.ajax({ // 회원가입 수행 요청. type: "POST", url: "/blog/..

    스프링 JPA의 OSIV 전략

    스프링 JPA의 OSIV 전략

    기존 전통적인 스프링 방식 개선 기존의 전통적인 스프링 방식은 컨트롤러가 종료되고 response를 해주기 직전에 JDBC 커넥션과 트랜잭션, 영속성 컨텍스트를 종료해주었다. 그런데 굳이 그렇게 하지 않고 서비스가 종료되고 나서 해주면 종료 시점이 당겨지기 때문에 DB의 부하가 적어진다. 모든 로직은 서비스에서 실행되기 때문에 당겨도 문제없다. 또한 JDBC 커넥션과 트랜잭션을 기존에는 요청이 들어오면 바로 시작했는데 컨트롤에서 사용할 일이 없으므로 요청이 들어오면 영속성 컨텍스트만 먼저 시작하고 JDBC 커넥션과 트랜잭션은 컨트롤러에서 서비스 단계로 넘어갈 때 시작시킨다. 이렇게 또 DB의 부하를 줄여준다. 그런데 만약 DB의 테이블이 Many To One 관계일 경우를 생각해보자 한 Team에 여러 ..