Spring 20

Spring Boot 게시판 만들기

참고 도서 : 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 Spring Boot 게시판 만들기 요구사항 분석 기능 조회 등록 수정 삭제 회원 구글 / 네이버 로그인 로그인한 사용자만 글 작성 본인이 작성한 게시물 권한 관리 사용 기술 Spring 2.3.3 H2 JPA Hibernate Entity를 만들 때 참고 사항 PK는 Long타입으로 잡고 Auto_increament로 잡는 게 좋다. 복합 키나, 유니크 키 기타 다른 키를 PK로 잡을 경우 아래와 같은 문제가 발생할 수 있다. FK를 맺을 때 다른 테이블에서 복합키 전부를 갖고 있거나, 중간 테이블을 하나 더 둬야 하는 상황이 발생한다. 인덱스에 좋은 영향을 끼치지 못한다. 유니크한 조건이 변경될 경우, PK전체를 수정해야 할 수도 있다. ..

Spring 2020.09.14

Spring Data JPA

JPA 스프링 레거시 프로젝트에서는 MyBatis를 이용해 Mapper를 만들고 직접 쿼리를 만들었다. 쿼리를 만들 때는 그 쿼리가 제대로 작동하는 지, 우선 해당 데이터베이스에서 직접 테스트하고, 코드에 적용했다. 간단한 CRUD 정도는 문제가 되지 않았지만, 그것도 쌓이면 나름 시간이 걸리는 일이다. 무엇보다 여러 개의 테이블을 join해서 작업하는 경우에는 쿼리를 짜는 데에만 꽤 오랜 시간이 걸렸다. 책에서도 "실제 개발 시간보다 SQL을 다루는 시간이 더 많았"다. "테이블 모델링에만 집중하고 객체를 단순히 테이블에 맞추는 기형적인 형태"였다고 설명한다. 내가 생각하기에 데이터는 거의 모든 것이다. 복잡하게 생각할 것도 없이 자명하다. 객체를 이용해 데이터를 운반하지만, 객체는 할 일을 마치면 가..

Spring 2020.09.14

스프링 시큐리티 어노테이션

스프링 시큐리티 어노테이션 주로 사용하는 세 가지 어노테이션 @Secured 스프링 시큐리티 초기부터 사용했다. ()안에 'ROLE_ADMIN' 같은 문자열 또는 문자열 배열을 이용한다. @PreAuthorize, @PostAuthorize 스프링3버전부터 지원한다. ()안에 표현식을 사용할 수 있어서 최근에는 더 많이 사용한다. http.authorizeRequests() .antMatchers("/sample/all").permitAll() .antMatchers("/sample/member").access("hasRole('ROLE_MANAGER')") .antMatchers("/sample/admin").access("hasRole('ROLE_ADMIN'..

Spring legacy 2020.09.13

JSP에서 스프링 시큐리티 사용하기

JSP에서 스프링 시큐리티 사용하기 스프링 시큐리티 관련 정보를 출력하려면 시큐리티 관련 태그 라이브러리를 선언해야 한다. 태그는 과 principal이라는 이름의 속성을 사용한다. 사용 예제 admin.jsp ... principal : MemberVO : 사용자 이름 : 사용자 아이디: 사용자 권한 : .. ...결과 표현식을 이용하는 동적 화면 어떤 페이지에서, 일반 사용자로 로그인했을 때 보여지는 내용과, 관리자로 로그인 했을 때 보여지는 내용이 달라야 한다면(이를테면 관리자용 메뉴 같은 것) 표현식을 이용하여 동적으로 구성할 수 있다. 표현식 설명 hasRole([role]) hasAuthority([authority]) 해당 권한이 있으면 true hasAnyRole([role,role2]) ..

Spring legacy 2020.09.13

Spring Security - 기존 테이블을 이용하는 인증방법

기존의 테이블을 이용한 시큐리티 인증 방법 1. 테이블 설계 회원 테이블과 권한 테이블 -- 회원 테이블 create table tbl_member( userid varchar(50) not null primary key, userpw varchar(100) not null, username varchar(100) not null, regdate timestamp default now(), moddate timestamp default now(), enabled char(1) default '1' ); -- 권한 테이블 create table tbl_member_auth( userid varchar(50) not null, auth varchar(50) not null, constraint fk_memb..

Spring legacy 2020.09.13

👿[Spring Error] java.lang.IllegalStateException: No primary or default constructor found for class || @Builder && @NoArgsConstructor

java.lang.AssertionError: Request processing failed; nested exception is java.lang.IllegalStateException: No primary or default constructor found for class com.coco.domain.BoardVO at org.junit.Assert.fail(Assert.java:89) at com.coco.controller.BoardControllerTest.registerTest(BoardControllerTest.java:78) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAc..

ERROR!!!!!!! 2020.09.13

👿 [Spring Error]java.lang.NoClassDefFoundError: org/springframework/jdbc/datasource/TransactionAwareDataSourceProxy

MyBatis - Spring 연결 테스트 중에 이런 에러가 발생했다. INFO : org.springframework.test.context.support.DefaultTestContextBootstrapper - Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.con..

ERROR!!!!!!! 2020.09.13

UriComponentBuilder

UriComponentBuilder 게시물을 POST방식으로 처리하고 나서도 페이지나 검색 조건을 유지하기 위해서는 페이지 정보와 검색 조건, 검색 키워드 정보를 RedirectAttribute객체로 직접 지정해야 했다. @PostMapping("/modify") public String modify(BoardVO boardVO, PageInfo pageInfo,RedirectAttributes redirect) { log.info("/board/modify"); log.info("BoardVO : " + boardVO); int result = boardService.modify(boardVO); log.info("MODIFY RESULT : " + result); redirect.addAttribut..

Spring legacy 2020.09.12

Spring 게시판 구현 - Presentation Layer II

Presentation Layer II 화면 CRUD 레이아웃은 BootStrap4의 Sb Admin을 이용했다. 링크 폴더 구조는 이렇다. /board/list /board/write /board/post post페이지에서 수정 따로 수정 페이지를 만들지 않고 자바스크립트를 이용하여 조회 페이지에서 바로 수정할 수 있도록 했다. /board/remove 모달 창을 쓸까, 말까 고민했지만 쓰지 않기로 했다. 네이버나, 페이스북 같은 웹에서 게시물을 삭제했을 때, 따로 삭제했다는 메세지 같은 것을 받은 기억이 없다. 따라서 굳이 필요한가... 있어도 되고 없어도 되는 기능이고, 없다고 사용자 입장에서 불편한 기능이 아니라고 판단해서 사용하지 않았다. 코드가 궁금하다면 참고 페이징 게시글을 조회했다가, 다시..

Spring legacy 2020.09.12

Spring 게시판 구현 - Presentation Layer

Presentation Layer 컨트롤러와 화면처리를 담당할 jsp가 프레젠테이션 계층이다. 컨트롤러를 완성하고 화면처리를 할 것이다. URL분기는 참고 달라진 점은 수정 페이지를 따로 만들지 않고 자바스크립트를 이용해서 처리할 것이므로 따로 분기하지 않았다. 컨트롤러 @Controller @RequiredArgsConstructor @RequestMapping("/board") @Log4j public class BoardController { private final BoardService boardService; @GetMapping("/list") public void getAllPost(Model model) { log.info("/board/list"); model.addAttribute("..

Spring legacy 2020.09.12