Spring/Spirng_CRUD(MVC_Patterns)

Basic_MVC4

whyWhale 2020. 11. 30.

environment-> intelij(Ultimate)+springInitialize+templateEngine(Mustache)
fronted : bootstrap

 

GIT-HUB      github.com/KBY-TECH/SpringBasic_MVC2
#SpringBasic_MVC3

 

기능 구현 :

{

   수정/삭제 기능에 대한 보안 처리 및 LocalDateTime 설정,

   답변 추가 및 답변 목록 기능 구현

}

 

 

수정/삭제 기능에 대한 보안 처리 및 LocalDateTime 설정

  •  equals()  두 객체의 내용이 같은지, 논리적 동등성(equality)를 비교 (value)
  •  hashCode() 두 객체가 같은 객체인지, 동일성(identity)를 비교 (reference)

Reference 동치

: Heap에 있는 한 객체를 서로 다른 reference가 참조하는 경우

두 reference에 대해 hashCode() 메서드를 호출하면 같은 값을 반환합니다.

 

객체 동치

: Heap에 두 개의 객체가 들어있고 두 reference가 각 객체를 참조하지만, 그 두 객체가 동치인 것으로 간주할 수 있는 경우Object 클래스로부터 상속받은 hashCode()와  equals()를 모두 override해야한다. 

 

즉, 같은 필드를 가진 두 개의 객체를 같다고 판단하기 위해 equals를 재정의(Override)하여 사용하는데 이 때, equals만 재정의하고  hashCode를 재정의 하지 않으면 각 객체는 다른 hashcode를 가지고 있게 된다. 이는 HashMap, HashSet과 같은 해시 기반의 컬렉션에서 오류를 발생시키는 원인이 되며, Object 명세에도 어긋나기 때문에 equals를 재정의 하려면 hashcode 역시 재정의 해주어야 한다. 

 

 

equals(object)가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 똑같은 값을 반환해야 한다.

 

Boadr class 안에 oop 캡슐화를 적용하기 위해 getUser를 통해 가져오는 것이 아닌 클래스 안쪽에서 다 해결할수 있도록 하기위한 Method 생성.

※해당 메소드안에 안에 equals는 아직 override 되지 않는 순수한 String 의 메소드이다. 주석에서 본 것처럼 해당 결과는 같은 사용자라 하여도 false가 난다. equals는 값만 비교하면 맞다고 할 수 있는 메소드라 그렇다. (값을 비교하는 것이 아니고 인스턴스가 같은 인스턴스인지도 구분해야 하므로)

 

User class 에서 equal Override 함.

equals 를 재정의함과 동시에 hashcode라는 메소드와 꼭 함께 재정의를 해야한다.

 

 

해당 사용자가 작성한 부분에서 수정과 삭제를 가능하게 하였다.

처음 로그인 여부를 확인한뒤 해당 세션을 가져와 현재 작성자와 일치하는지 비교하기 위해 board안에 정의한 isSameWrter메소드를 사용하여 일치 여부를 확인한다.

 

 

 단변 추가 및 답변 목록 기능 구현

 

답변에 대한 class를 만든후 Interface 를 만들고 JPA를 상속받는다.

먼저 게시판과 해당 댓글에 관한 관계를 생각해보면 하나의 게시판에 여러가지의 댓글이 달릴수 있고 또한 user에 관하여 생각하면 해당 user는 여러개의 댓글 쓰기가 가능하므로 게시판과 user 둘다 answer class와의 관계는 1:N이라고 생각할 수 있다.

 

ㅇ@Lob 이라는 annotation은 해당 글자의 db colume type은 varchar(255) 가 되므로 255글자에 대한 글 밖에 쓰지 못하게 되므로 이 부분을 @Lob을 이용하여 255보다 더 큰 내용을 삽입하도록하는 애노테이션이다.

 

댓글에 관한 controll을 보면 해당 댓글은 어딘가에 종속되있지 않을 거라는 생각을 가질 수 있다.

댓글을 쓰기 위해 일단 해당 게시판의 상세페이지에서 볼 수 있을 것이다 라고 생각하면 해당 댓글을 상세보기 안에서 이루어지므로 해당 게시판의 아이디가 항상 쓰일것이다(댓글 달기, 수정,삭제) 어디 게시판의 id를 가지고 댓글을 어떻게 할건지가 대다수 이기 때문이다.

ㅇ해당 bean 두개를 상속받아야 한다. 제일 처음 comment class 안에는 1:N의 관계인 user와 board의 foreignKey가 필요므로 해당 빈을 주입받은 후 comment class의 생성자에서 현재 login한 user와 해당 board id를 받을 수 있는 객체를 가져온다. 그리고 해당 데이터베이스에 save하여 저장한다.

 

이 다음으로 보자면 해당 댓글을 뿌려주기 위해 redirect함과 동시에 comment를 뿌려줄까라는 생각을 먼저 했다. 하지만 그러면 해당 댓글이 작성할 때만 뿌려준다.! 작성할 때가 아닌 기본적으로 detail페이지에 들어가면 먼저 쓴 혹은 이전에 쓴 댓글또한 보여져야 하므로 해당 상세페이지 화면에서 뿌려줘야 한다고 생각했다.

model을 통해 addAttributes 로 이용을 해도 되지만! 이 코멘트를 뿌려주기 위해 해당 list안에 집어 넣은 상태를 유지한 후 해당 list를 array에 담아 계속 담고 있고 해당 id별 오름차순으로 정렬한다.(첫번째 댓글이 가장 상위에 배치) 

board 클래스 안에 필드로 생성.

해당 디테일 페이지를 다시 보게 된다면 변경할 것은 전혀 없다. 이미 model안에는 board가 있고 해당 board 클래스 안에에 model에 넘겨 줌과 동시에 이미 arr안에 존재하기 때문에 이 arr안에 username과 해당 생성 날짜를 가져오기만 하면 된다.

변경이 전혀 없는 것을 볼 수 있다.

ㅇ해당 template 을 보면 이미 #board 문법으로 for문을 돌고 있으며 해당 arr이름인 comment에 대한 필드 멤버를 가져오면 된다

'Spring > Spirng_CRUD(MVC_Patterns)' 카테고리의 다른 글

Basic_MVC6(Ajax)  (0) 2020.12.09
Basic_MVC5  (0) 2020.12.01
Basic_MVC3  (0) 2020.11.26
Basic_MVC2  (0) 2020.11.19
Basic_MVC  (0) 2020.11.12

댓글