스프링 부트 2주차 정리

선장원·2022년 1월 15일
1

SpringBoot

목록 보기
11/18

2주차 (01/10~01/14)

스프링부트

기능

삭제

ajax

삭제를 하고 HttpStatus.OK를 보내서 확인을 하고 주소를 재요청

테스트

테스트 방법은 다양하다

로그인으로 해서 하는 방법도 있고

밑에 처럼 findById로 검색하는 방법도 있다
findById는 예외가 발생해서 예외처리를 해줘야한다

수정

컨트롤러

update 페이지를 띄울 때 세션에 있는 이메일으로 해당 아이디의 값을 가져온다
JPA는 save를 할 때 pk값도 같이 보내면 pk 값을 인지하고 새로 만드는 것이 아니라 해당 데이터를 찾아서 수정을 해준다

서비스

Entity클래스에 업데이트용 메서드를 만들어줘야함

ajax

내가 만든거

JSON을 이용해 만든 함수

JSON 사용시 주의사항 확인하기

테스트

saveDTO1에 만들어서 보내고

detailDTO2에 담아서 수정하고

detailDTO3에 다시 담아서 가져오고

saveDTO1와 detailDTO3을 비교해서 일치하지 않으면 성공!

interceptor

request단계에서 확인을 하고 response로 보내준다?

홈페이지를 이동하기 전에 조건을 검색을 해서 일치하면 홈페이지로 보내주고 아니면 로그인 페이지로 보낸다

홈페이지를 누르면 WebConfig 파일이 실행이 되고
그 안에서 인터셉터 메서드를 불러와서 해당 인터셉터 메서드로 넘어가서
해당 인터셉터 메서드의 결과를 가져와서 해당 인터셉터가 실행이 되면 로그인 페이지로 넘어간다

WebConfig클래스

@Configuration : 설정 정보를 스프링 실행시 등록 해줌

implements WebMvcConfigurer을 해줘야함!

@Override이기 때문에 똑같이 해야함

InterceptorRegistry : 인터셉터를 저장해주는 저장소?

.addInterceptor(new 체크인터셉트 메서드) : 만든 인터셉트 메서드를 가져온다
.order(숫자) : 해당 인터셉터가 실행되는 순서
.addPathPatterns(“/**”) : 해당 프로젝트의 모든 주소에 대한 인터셉트 적용
.excludePathPatterns(“주소1”,”주소2”) : 적은 주소는 예외

LoginCheckInterceptor클래스

implements HandlerInterceptor를 해줘야 한다

HttpServletRequest : 요청을 보낸 페이지
HttpServletResponse : 내가 요청을 할 페이지

HttpSession에 request로 받아온 세션을 넣어 준다

if (session.getAttribute(“이메일 세션 이름”)==null)을 이용해서 값이 없다면
요청을 보낸 페이지(전 페이지)의 주소를 response로 보내고 결과를 false로 보낸다

로그인이 되어 있는 상태면 true를 보내서 요청한 페이지로 보낸다

여기서 부터는 내가 만든 내용
전페이지 주소를 @RequestParam으로 받아서 모델로 다시 보내고
로그인 페이지에서 form태그 안에 input을 히든으로 만들고 (DTO에 URL용 필드 하나 생성) 로그인 DTO에서 받아서 같이 가져와서 리턴을 redirect:+로그인DTO.getURL으로 해서 다시 해당 페이지로 돌아가는 것이다

쌤이 만든 내용
LoginCheckInterceptor클래스에서 response.sendRedirect로 URL을 보내지 않고 session에 저장해서 로그인하면 다시 꺼내서 사용한다

컨트롤러

mybatis

설정

  • application.yml

    alias설정을 하면 mapper에서 parameterType과 resultType에서 앞부분을 지우고 DTO이름만 써서 사용이 가능하다
  • gradle
    implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'

MemberMapperRepository 인터페이스

@Mapper 를 해줘야함, 인터페이스로 만들어야함

mapper에 있는 id와 메서드 이름을 같게 해야한다

  • 2가지 방법이 있다
    mapper의 내용을 불러오는 것

어노테이션을 이용해서 직접 하는 것 두가지가 있다

memberMapper.xml

위치

mapper 태그 namespace는 맵퍼리포지토리를 지정해 주면 된다

업테이트 시간 입력

BaseEntity클래스

abstract : 추상 클래스

@CreationTimestemp : 만들어 질 때 입력이 되는 시간

@Column(updatable = false) : 업데이트 때는 수정이 안됨

@Column(insertable = false) : 인설트 할 때는 입력이 안됨

BoardEntity클래스

BaseEntity를 상속 받아서 가져와야함

BoardDetailDTO클래스

Entity에서 가져올 때 시간을 둘중에 하나만 가져오려면 insert시에는 updateTime이 입력이 안되니 updateTime이 null이라면 createTime을 입력한다

페이징

설정

  • BoardPagingDTO
    페이징용 DTO를 만들어준다 그냥 디테일로 해도 상관 없는듯

  • PagingConst

페이징용 상수 클래스를 하나 만들어준다
그냥 컨트롤러에서 해도 될거같기도 하고

서비스

잘 안보이네 ㅠ

  1. 페이지
  2. 글 갯수
  3. 오름차순, 내림차순
  4. 기준 단, Entity클래스의 필드이름 기준으로 해야함(여기서 _를 인식을 못함)

.map() : Entity클래스를 안에서 DTO로 바꿔주는 기능 같은 느낌?????

컨트롤러

리스트는 따로 가져오고
startPage와 endPage는 따로 컨트롤러에서 계산을 해서 보내줘야 함
startPage는 전에 쓰던거랑 비슷한데

endPage는 삼항연산자를 써서 그런가 조금 어렵긴한데 비슷한 느낌
페이지카운트 메서드를 안쓰고 페이징 메서드로 한번에 다 구해와서 더 편한?

html

타임리프에서도 삼항연산자를 써서 사용하네

html에서 타임리프로 작성하는 주소값 /board(page=1) 이런식으로 보낸다

그럼 여러개 보내면 /board(page=1, var=1) 이건가 /board(page=1 & var=1)이건가

찾아보니 쉼표로 구분 한다고 한다

boardList.first = isFirst()
boardList.number = getNumber()

검색

내가 만들어서 조금 이상하다
이게 맞는 건가

html

컨트롤러

서비스

타입을 나누는 방법을 리포지토리에서 하려고 했는데 어려워서 포기함 ㅠㅠ
if문으로 타입에 따라 다른 메서드를 실행해 준다

findBy컬럼이니 한 메서드에서 3가지를 구별하는거는 어려울려나?

리포지토리

맨위에 타입별로 한번에 나눠서 가져오려고 했는데 안되는 듯

Containing은 mysql의 like 연산자랑 같은 기능이다
keyword를 포함한 단어를 검색해 준다

테스트

조회수

이것도 내가 만들어서 맞는지 모름 월요일에 알려주려나

설정

디테일DTO랑 Entity클래스랑 각종 메서드에 boardHits를 추가해주고
application.yml에서 create로 바꿔서 드랍하고 테이블을 다시 만들어줘야 함
html에도 추가해줘야 함

리포지토리

@Transactional : update / delete를 사용 하려면 해줘야함
@Modifying : @Query를 사용하려면 사용해야함
@Query(“”) : 여기에 쿼리를 사용해서 보내는데 DB기준이 아니라 Entity클래스 기준이다

빨간색끼리 맞춰줘야 한다

노란색은 Entity클래스의 필드 명을 가져와야한다

흰색끼리 맞춰 주고 @Query안에 : 를 써줘야지 밑에 있는 데이터를 가져온다

서비스

컨트롤러

findById와 findByIdAjax에 추가해 준다

기타

주소 재요청

location.href = ‘/member/’;

ResponseEntity

차이점
ResponseEntity : 데이터 & 상태코드를 함께 리턴할 수 있음
@ResponseBody : 데이터를 리턴 할 수 있음

상태코드 : 200, 400, 404, 405, 500등

데이터 보내기

리턴 타입을 ResponseEntity로 하고
리턴을 ResponseEntity<보낼 데이터 타입>(보낼 데이터, 보낼 상태);로 해서 보내면 된다

나머지는 ajax를 사용할 때 와 같다

화살표 함수

Es6 자바스크립트

const 함수이름 = (매개변수) =>{
실행 내용
}

위 방식으로 function대신해서 만들 수 있다

assertThrows

import static org.junit.jupiter.api.Assertions.*;

assertThat과 임포트가 다르다

세션에서 이메일값 가져오기


session.getAttribute(‘이름’); 을 하면 object 형식으로 가져온다
그래서 (String)으로 강제 형변환을 해줘야 한다

JSON.stringify

JSON타입으로 ajax를 사용하려면
contentType: ‘application/json’,을 추가 해줘야한다

@RequestBody

JSON 형식으로 컨트롤러에서 받을 때는 @RequestBody를 추가해서 DTO를 받아야한다

Optional

optional타입으로 받아서 if문으로 데이터가 있는지 없는지 확인을 하고
데이터가 있다고 판단이 되면 데이터를 가져온다

용어추가

  • 유닛 테스트 : 기능별로 테스트하는 것

  • 삼항연산자 : 자바에서 쓰이는 기초 연산자이다

위의 if문과 아래 삼항연산자는 같은 공식이다

  • 쿼리스트링 : 주소에 ?를 사용해서 값을 보내는 방식

  • 체인메서드

해당 메서드처럼 줄줄이 이어져있는 메서드를 체인메서드라고 한다

profile
코딩도전기

0개의 댓글