티스토리 뷰
백엔드 개발에서 다른사람의 코드를 이해하고 제가 짠 코드와 합치는 과정을 적어보려고 합니다.
프로젝트 이름은 icelink 입니다.
1번째
다른 사람의 코드를 들고온 뒤 실행했을 때 에러가 발생하였습니다.
java.sql.SQLException: Access denied for user 'icelink'@'localhost' (using password: YES)
나의 DB 설정과 달라서 발생한 에러였고 username을 hoyoung으로 바꾸어 해결하였습니다.
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/icelink?serverTimezone=Asia/Seoul
# username: icelink
username: hoyoung
password: 1234
2번째
DB 설정을 하였음에도 Unknown database 'icelink'라는 에러가 발생하였습니다.
java.sql.SQLSyntaxErrorException: Unknown database 'icelink'
Mysql workbench에서 다음 구문을 통해 해결하였습니다.
create database icelink;
use icelink
3번째
글을 작성하는 폼은 다음과 같이 만들어져 있습니다.
내용을 채워넣고 제출버튼을 누르니 다음과 같은 에러가 발생하였습니다.
org.hibernate.PropertyValueException: not-null property references a null or transient value : com.example.demo.entity.Board.memberEntity
작성자 아이디가 보드 엔티티의 외래키로서 참조 무결성 문제가 발생하였습니다.
참조 무결성
이란 관련된 테이블의 레코드 간의 관계를 유효하게 하는 규칙으로, 사용자의 실수로 관련 데이터가 삭제되거나 수정되는 것을 막아줍니다. 참조 무결성을 설정할 수 있는 조건은 기본 테이블에서 일치하는 필드가 기본 키
이거나, 고유 인덱스를 갖고 있거나, 관련 필드의 데이터 형식이 같아야 합니다.
이때 저의 경우는 작성자를 등록하지 않았기 때문에 참조할 아이디가 없어서 생긴 오류이며 기본키는 null 값을 가질 수 없다는 개체 무결성 조건을 어겼기 때문에 발생한 에러 였습니다.
먼저 작성자를 등록한 뒤 게시글을 작성하였더니 해결 되었습니다.
+ 3번째
로그인을 하였다면 굳이 작성자 아이디를 적지 않아도 되지 않을까라고 생각하였고 방법에 대해 생각해보았습니다.
로그인을 하기 위해서 JPA 메소드를 정의해주었습니다.
// MemberEntity
@Id // pk 지정
private String id;
@Column(nullable = false, length = 100)
private String user_pw;
//MemberRepository
@Repository
public interface MemberRepository extends JpaRepository<MemberEntity, String> {
Optional<MemberEntity> findByIdAndUser_pw(String id, String user_pw);
}
JPA 메소드가 언더바를 인식하지 못하는 것 같아서 찾아보다가 일단 변수명을 카멜 표기법으로 바꿔서 해결하였습니다.
언더바를 인식하는 방법은 공부해볼 생각입니다.
// MemberEntity
@Id // pk 지정
private String id;
@Column(nullable = false, length = 100)
private String userPassword;
// MemberRepository
@Repository
public interface MemberRepository extends JpaRepository<MemberEntity, String> {
Optional<MemberEntity> findByIdAndUserPassword(String id, String userPassword);
}
로그인을 하면 세션을 만들어 세션이 아이디를 가지고 있도록 설정하였습니다.
@PostMapping("/member/login")
public void login(@RequestBody MemberEntity member, HttpServletRequest request) {
MemberEntity m1 = memberService.login(member);
if(m1 == null) {
System.out.println("존재하지 않는 사용자입니다.");
return;
}
HttpSession session = request.getSession();
session.setAttribute("id", m1.getId());
session.setMaxInactiveInterval(30*60);
}
기존의 게시글을 작성하는 코드는 다음과 같습니다.
@PostMapping("/board/boardWrite")
public String boardSave(Board board) {
boardService.write(board);
return "index";
}
이 코드를 세션을 사용하여서 로그인 한 사용자로 하여금 작성하도록 boardService를 변경해주었습니다.
public void write(Board board, HttpServletRequest request) {
HttpSession session = request.getSession();
MemberEntity m1 = memberRepository.findById((String)session.getAttribute("id")).orElseGet(()-> {
return null;
});
board.setMemberEntity(m1);
board.setDate(LocalDateTime.now());
boardRepository.save(board);
}
하지만 html 폼을 바꾸는 중에 에러가 발생하였습니다.
Javascript 경로를 찾지 못한다는 것이었는데 제대로 된 주소는 localhost:8081/js/member.js 가 되어야 할 것 같습니다.
SpringBoot는 결론만 간단히 말하자면 프레임워크(Spring / SpringBoot...)에는 위 css와 js같은 정적리소스파일의 경로는 /resource/가 default로 설정되어 있다고 하여 경로를 다음과 같이 설정함으로서 해결하였습니다.
login을 실행하면 다음과 같이 세션에 등록됨을 확인할 수 있었습니다.
다음과 같이 변경된 폼에 대해서 실행이 됨을 알 수 있었습니다.
4번째
비밀번호를 분실한 경우에 대해서 메일을 보내서 확인하는 방법을 진행해보고 싶었습니다.
세션에 로그인한 사용자의 email 주소를 집어넣어 비밀번호를 찾길 원한다면 메일을 발송하게끔 만들었습니다.
public void sendSimpleMessage(HttpServletRequest request) {
HttpSession session = request.getSession();
String address = (String) session.getAttribute("email");
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom("hoyoung.wjd@gmail.com");
message.setTo(address);
message.setSubject("인증코드입니다.");
message.setText("Icelink 플랫폼을 이용해주셔서 감사합니다. \n\n인증번호는 다음과 같습니다: " + key);
emailSender.send(message);
}
key는 랜덤으로 생성한 코드이며 이 코드와 맞을 시 비밀번호를 재설정할 수 있게끔 하려고 합니다.
현재 key를 전역변수로 설정하였지만 이보다 더 좋은 방법이 있을 것 같아 고민해보려고 합니다.
메일 발송화면은 다음과 같습니다.
더욱 더 공부해야 될 필요를 느끼며 블로그 작성을 마치도록 하겠습니다.
참고자료
DB정리는 할껀데 핵심만 할껍니다. - 키와 무결성
무결성은 데이터 베이스에 있어서 정말 중요한 주제이다. 시험에도 잘나오고 면접에도 잘나오므로 잘 알아두도록 하자key라는 것은 무언가를 식별하는 고유한 식별자(identifier) 기능을 한다. 이
velog.io
https://krksap.tistory.com/917
spring data jpa 메소드 이름으로 쿼리 생성
spring data jpa 메소드 이름으로 쿼리 생성 http://docs.spring.io/spring-data/jpa/docs/1.4.1.RELEASE/reference/html/jpa.repositories.html wordSampleJPQL snippetAndfindByLastnameAndFirstname… where x.lastname = ?1 and x.firstname = ?2OrfindByLast
krksap.tistory.com
https://ajdahrdl.tistory.com/236
[Spring Boot] 이메일 전송하는 방법
안녕하세요. 이번 포스팅에서는 Spring Boot에서 간단한 이메일을 보내는 방법에 대해 공유해드리려고 합니다. 총 두 가지 챕터(이메일 계정 설정, Spring Boot 설정)이 있습니다. 1. Spring Boot에서 보내
ajdahrdl.tistory.com
'🍃 스프링' 카테고리의 다른 글
[SPRING] 외부 REST api 사용하기 (0) | 2023.05.20 |
---|---|
[SPRING] IntelliJ 설정 (0) | 2023.05.15 |
[SPRING] Filter, Interceptor (0) | 2022.10.06 |
[SPRING] Dispatcher Servlet (0) | 2022.10.02 |
[SPRING] JPA, ORM (0) | 2022.09.27 |