실제로 /blog/selectArticleList.do 를 하면 로그인 페이지로 넘어간다 (정상적으로 화면이 보였다면 다른 세션으로 로그인 해서 filter를 통과한 경우이다.)
간단히 해결하는 방법은 .do 대신 .blog를 사용하면 된다.
호출하는 url을 바꾸면 되는 것인데
@RequestMapping("/blog/selectArticleList.blog") public String selectArticleList(@ModelAttribute("searchVO") BoardVO boardVO, ModelMap model) throws Exception
와 같이 하면 된다.
src/main/webapp/WEB-INF/config/egovframework/springmvc/egov-com-servlet.xml 에
그리고 블로그 게시물이 1개 있었는데 안나왔던 이유는
controller에서 bbsID 가 없어서였다. 원래는 넘겨받는 boardVO 안에 bbsId가 있으나 이번경우는 블로그도 1개만운영하고 바로 호출하므로 직접 하드코딩한다.
쿼리 로그 확인시 bbsId가 있는것이 확인되고 실행해보면 게시글 1개가 있다.
SELECT a.NTT_ID, a.NTT_SJ, a.NTT_CN, a.FRST_REGISTER_ID, IFNULL(b.USER_NM, a.NTCR_NM) as FRST_REGISTER_NM, DATE_FORMAT(a.FRST_REGIST_PNTTM, '%Y-%m-%d') as FRST_REGIST_PNTTM, a.RDCNT, a.PARNTSCTT_NO, a.ANSWER_AT, a.ANSWER_LC, a.USE_AT, a.ATCH_FILE_ID, a.BBS_ID, a.NTCE_BGNDE, a.NTCE_ENDDE, a.SJ_BOLD_AT, a.NOTICE_AT, a.SECRET_AT, c.COMMENT_CO FROM COMTNBBS a LEFT OUTER JOIN COMVNUSERMASTER b ON a.FRST_REGISTER_ID = b.ESNTL_ID LEFT OUTER JOIN (SELECT NTT_ID, BBS_ID, COUNT(1) AS COMMENT_CO FROM COMTNCOMMENT WHERE USE_AT = 'Y' GROUP BY NTT_ID, BBS_ID) c ON a.NTT_ID = c.NTT_ID AND a.BBS_ID = c.BBS_ID WHERE a.BBS_ID = 'BBSMSTR_000000000002' AND a.USE_AT = 'Y' AND a.NTT_SJ LIKE CONCAT ('%', '','%') ORDER BY a.SORT_ORDR DESC, NTT_NO ASC LIMIT 10 OFFSET 0 ;
이제 jsp파일을 수정할 차례
BlogArticleList.jsp 파일에서
cop/bbs/selectArticleList.do 등 cop/bbs -> blog로, .do로 되어있는 것을 .blog로 모두 찾아 바꿔준다.
//---------------------------- // template 처리 (기본 BBS template 지정 포함) //---------------------------- model.addAttribute("bbsTmplatCours", "/css/egovframework/com/cop/tpl/egovBaseTemplate.css");//기본 BBS template 지정 : css 경로. 추후 변경
////----------------------------- if (egovArticleCommentService != null){ if (egovArticleCommentService.canUseComment(boardVO.getBbsId())) { model.addAttribute("useComment", "true"); } } ////--------------------------
model.addAttribute("bbsId", "BBSMSTR_000000000002");// 블로그는 1개만 운영하므로 생성된 블로그의 bbsId 사용-- 나중에 property로
Spring Boot를 이용하여 Login까지 간단히 끝냄. Maven버전이 아닌 Gradle 버전으로 남김
1. 새로운 프로젝트 생성 - Type : Gradle 로 선택(필수)
2. Next 버튼 누른 후 Dependency 설정 - 이전에 사용했던 항목이 있으면 Frequently Used 로 바로 보임. 체크를 하면 됨 - 없으면 왼쪽 하단 부분에서 찾아(세모 클릭하면 펼쳐짐) 체크 - 선택된 dependencies는 오른쪽 하단에 Selected 로 표시 됨
3.프로젝트 구조 - 파일 위치 및 파일명 참조
4. Build.gradle 확인 - dependencies 에서 implementation은 선택한 항목- - commons-beanutils 를 추가함.
-- jquery, bootstrap 추가
https://www.webjars.org/ 에서 해당 버전에 맞게 찾아옴 - Build Tool 에서 해당 Tool 선택 - 사용할 jar 의 추가방법 복사 : compile 'org.webjars:jquery:3.4.1'
-- 추가한 build.gradle
5. DB 연결 : src/main/resources 아래에 application.properties - server 포트 변경할 때 사용. 기본값은 8080이므로 변경할 때만 추가 - mysql 설정에 localhost:3306 뒤에 연결할 db명을 적고 username, password - JPA를 사용하므로 hibernate.dll-auto=create 으로 추가
6. db script - mysql 을 사용하는 경우 id column에 PK, Auto_increment 속성을 넣는다. - oracle을 사용하는 경우에는 auto_increment 는 필요없다(별도의 sequence 사용)
- key 정보를 잘못 설정한 경우 : table 생성 후 auto_increment 를 추가하려고 하면 foreign key가 있다고 오류남 Key 삭제 후 다시 만들어야 함. table drop 이후에는... 애매해 짐
# unique key 삭제 및 생성 drop index 유니크키명 on 테이블명; create unique index 유니크키명 on 테이블명 (컬럼명, 컬럼명);
# type이 innodb일 경우에는 unique key 삭제 하기전에 foreign key를 삭제해야 한다. alter table 테이블명 drop foreign key 포린키명; drop index 유니크키명 on 테이블명;
# innodb 타입 foreing key 재생성 alter table 테이블명 add CONSTRAINT 포린키명 foreign key (컬럼명) references 디비명 (컬럼명) on delete cascade;7. 미리보기 - build.gradle에서 bootstrap, jquery를 추가하지 않은 경우 - 개발자 모드로 확인시 script 오류가 확인 됨.
@FieldMatch.List({ @FieldMatch(first = "password", second = "confirmPassword", message = "The password fields must match"), @FieldMatch(first = "email", second = "confirmEmail", message = "The email fields must match") }) public class UserRegistrationDto {
@NotEmpty private String firstName;
@NotEmpty private String lastName;
@NotEmpty private String password;
@NotEmpty private String confirmPassword;
@Email @NotEmpty private String email;
@Email @NotEmpty private String confirmEmail;
@AssertTrue private Boolean terms;
public String getFirstName() { return firstName; }
public void setFirstName(String firstName) { this.firstName = firstName; }
public String getLastName() { return lastName; }
public void setLastName(String lastName) { this.lastName = lastName; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
public String getConfirmPassword() { return confirmPassword; }
public void setConfirmPassword(String confirmPassword) { this.confirmPassword = confirmPassword; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
public String getConfirmEmail() { return confirmEmail; }
public void setConfirmEmail(String confirmEmail) { this.confirmEmail = confirmEmail; }
public Boolean getTerms() { return terms; }
public void setTerms(Boolean terms) { this.terms = terms; } }
public SampleUser findByEmail(String email) { return userRepository.findByEmail(email); }
public SampleUser save(UserRegistrationDto registration) { SampleUser user = new SampleUser(); user.setFirstName(registration.getFirstName()); user.setLastName(registration.getLastName()); user.setEmail(registration.getEmail()); user.setPassword(passwordEncoder.encode(registration.getPassword())); user.setRoles(Arrays.asList(new SampleRole("ROLE_USER"))); return userRepository.save(user); }
@Override public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { SampleUser user = userRepository.findByEmail(email); if (user == null) { throw new UsernameNotFoundException("Invalid username or password."); } return new org.springframework.security.core.userdetails.User(user.getEmail(), user.getPassword(), mapRolesToAuthorities(user.getRoles())); }
@Controller @RequestMapping("/registration") public class UserRegistrationController {
@Autowired private UserService userService;
@ModelAttribute("user") public UserRegistrationDto userRegistrationDto() { return new UserRegistrationDto(); }
@GetMapping public String showRegistrationForm(Model model) { return "registration"; }
@PostMapping public String registerUserAccount(@ModelAttribute("user") @Valid UserRegistrationDto userDto, BindingResult result) {
SampleUser existing = userService.findByEmail(userDto.getEmail()); if (existing != null) { result.rejectValue("email", null, "There is already an account registered with that email"); }
if (result.hasErrors()) { return "registration"; }
이전에는 실행이 잘 되었는데 다른버전을 설치하고 나니.. 자동으로 실행되던 mysql이 실행되지 않는다.
mysqld 로 실행해보니
C:\Program Files\MySQL\MySQL Server 5.7\bin>mysqld mysqld: Can't change dir to 'C:\Program Files\MySQL\MySQL Server 5.7\data\' (Errcode: 2 - No such file or directory) 2019-10-02T13:52:36.921289Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2019-10-02T13:52:36.921289Z 0 [Note] --secure-file-priv is set to NULL. Operations related to importing and exporting data are disabled 2019-10-02T13:52:36.922287Z 0 [Note] mysqld (mysqld 5.7.19) starting as process 24040 ... 2019-10-02T13:52:36.929270Z 0 [Warning] Can't create test file C:\Program Files\MySQL\MySQL Server 5.7\data\DESKTOP-PNS3EHE.lower-test 2019-10-02T13:52:36.929270Z 0 [Warning] Can't create test file C:\Program Files\MySQL\MySQL Server 5.7\data\DESKTOP-PNS3EHE.lower-test 2019-10-02T13:52:36.930269Z 0 [ERROR] failed to set datadir to C:\Program Files\MySQL\MySQL Server 5.7\data\ 2019-10-02T13:52:36.932263Z 0 [ERROR] Aborting