스프링 부트 3주차 정리

선장원·2022년 1월 22일
1

SpringBoot

목록 보기
17/18

3주차 (01/17~01/21)

스프링 부트

참조관계/파일 삭제/페이징+글 갯수/검색+페이징+글 갯수/ajax파일 보내기

참조관계

CommentEntity

하위 테이블/자식 테이블

@ManyToOne
댓글 : 게시글 = N : 1

앞부분이 해당 클래스의 자리

@ManyToOne(fetch = FetchType.LAZY)

LAZY는 해당 메서드를 통해서 필요하면 가져옴
EAGER는 모든 참조를 가져옴

@JoinColume(name = “board_id”)
참조 하고자 하는 테이블의 PK컬럼이름
DB에 만들어지는 이름으로 해야함

private BoardEntity boardEntity;
참고하고자 하는 테이블을 참고하고자하는 엔티티 전체를 설정

toSaveEntity

boardId가 컴럼 이름은 boardId로 되어 있지만 타입은 BoardEntity로 되어 있어서 Long 타입 숫자를 넣어줘도 인식을 못하고 service에서 해당 게시글의 boardId를 사용해서 Entity클래스를 가져와서 CommentEntity클래스로 보내줘야 함

그럼 jpa가 알아서 PK값이 id만 입력을 하고 나중에 그 아이디를 이용해서 게시판도 불러오는 것이 가능하다

Service

BoardRepository를 사용해서 해당 boardId의 Entity클래스를 불러와서 toSaveEntity메서드를 실행 할 때 같이 보내준다

BoardEmtity

상위 테이블/부모 테이블

@OneToMany(mappedBy = “boardEntity” , fetch = FetchType.LAZY)
private List<CommentEntity> commentEntityList = new ArrayList<>();

fatch

EAGER는 한번에 모든 참조를 가져옴

LAZY는 필요할 때 가져오고 메소드를 통해서 가져오고

on delete cascade

cascade = CascadeType.ALL
orphanRemoval = true

부모 테이블에서 @OneToMany 어노테이션 안에 설정을 해주면 on delete cascade 로 사용할 수 있다

위 방법 말고 @OnDelete의 방법도 있지만 이 방법은 방식이 다르다고 한다

on delete null

cascade로 안하고 null값으로 지정을 하고 싶다면

Entity클래스 밑에 @PreRemove 어노테이션을 작성해 주어야한다!

화살표 함수는 for문 이랑 비슷하다

이렇게 지정을 해주면 삭제를 하기 전에 PreRemove가 먼저 실행되고
참조된 데이터들을 null값으로 지정하고 데이터를 지워준다!

외래키로 지정된 자식 테이블 불러오기

부모 클래스의 자식 클래스를 불러올 때는 따로 불러오지 않고 부모 클래스의 List클래스를 불러오면 한번에 불러 올 수 가 있다.

파일 삭제

회원 수정을 할 때

deleteFile을 File클래스 타입으로 만들고 불러온 Entity에서 filename를 빼서 주소를 만든다

새로운 파일을 만들고 전에 있던 파일은
if문으로 있는지 없는지 검사후 있다면 delete메서드를 통해서 삭제한다.

아 맞다 딜리트에도 넣어야지

페이징+글 갯수

전에 쌤이 주신 방법이랑 다르게 해서 이것 저것 바꿀게 엄청 많다
학원사람들이 보고 있다면 추천하지 않는다.

컨트롤러

pageable에 page를 지정해주고 (여기까지는 동일/단 전에는 1이였지만 지금은 0)
size는 내가 보고 싶은 글 갯수이다
sort는 내가 볼 기준을 정하는 것(Entity기준으로 해야함, DB컬럼 아님)
direction은 정렬 기준이다

서비스

findAll메서드의 괄호 안이 깔끔해졌다
pageable에 담아서 보내서 그렇다

html을 거의 다 바꿔야 함

이것도 2~3번 해보니 이해가 잘 되네

검색+페이징+글 갯수

리포지토리

searchType별로 3가지를 준비한다
Pageable을 안넣으면 오류가 남 ㅠㅠ
프로젝트 실행이 안됨

처음에 Page<>로 했다가 오류나서 List로 했는데 그건 값을 못나눔

서비스

searchType별로 if문을 이용해서 가져온다

여기서 엄청 고생함
이렇게 해보고 저렇게 해보고 계속 해보다가 겨우 찾음

컨트롤러

주소로 들고 다녀야하는 애들이 많아졌다
form에서 post방식을 쓰다가 페이지를 옮겨다녀야 하니 get방식으로 바꿨다

html을 search용으로 하나 만들고 이것 저것 바꿔야 할 것들이 많다
학원친구들이 보고 있다면 추천하지 않음

ajax 파일 보내기

html

FormData를 사용한다
파일을 같이 보내려면 해야하는 것이 많다
ajax에 enctype을 해줘야하고
processData를 false으로
contentType을 false으로
cache를 false으로
timeout을 600000으로 해준다

  • processData:false
    일반적으로 서버에 전달되는 데이터는 query String형태로 전달 된다.
    data파라미터로 전달된 데이터를 jQuery 내부적으로 query string로 만드는데, 파일 전송의 경우 이를 하지 않아야하기 때문에 설정.

  • contentType:false
    원래 contentType의 defauit 값이 "application/x-www-form-urlencoded; charset=UTF-8"이기 때문에 multipart/form-data로 전송이 되게 false로 넣어준다.

  • cache:false
    IE브라우저에서 ajax를 사용하다보면, 데이터가 갱신이 안되고 이전 데이터가 그대로 남아 있는 경우가 있는데 이는 IE브라우저에서 ajax통신을 할 때, 새로운 url을 호출하지 않고 가지고 있는 cache값을 그대로 노출 시켜주기 때문이다. 이렇게 cache:false로 해주면 브라우저 캐쉬를 막아서 캐쉬 값이 아닌 현재 값을 호출해 올 수 있다.

  • timeout
    비동기 통신 ajax를 사용할 때 대기시간을 설정하는 것인데, 이 값을 설정하면 대기 하는 시간이 지날 경우 에러의 상태로 전환 된다.

컨트롤러

ModelAttribute로 해도 된다고는 하는데 나는 오류가 나서 그냥 RequestParam으로 각각 다 받았다

MultpartFile을 받기 위해서는 MultipartHttpServletRequest클래스를 추가해 주어야 한다.
내 생각이 맞다면 파일 파라미터 뒤에 있는 것이 좋을 것 같다

리턴을 주소값으로 보내서 바로 location.href로 findById페이지로 보내버렸다

이제 팀이 정해졌고 아이디어를 생각해야겠는데 뭐로 해야할지 정말 모르겠다 ㅠ

profile
코딩도전기

0개의 댓글