삭제를 하고 HttpStatus.OK를 보내서 확인을 하고 주소를 재요청
테스트 방법은 다양하다
로그인으로 해서 하는 방법도 있고
밑에 처럼 findById로 검색하는 방법도 있다
findById는 예외가 발생해서 예외처리를 해줘야한다
컨트롤러
update 페이지를 띄울 때 세션에 있는 이메일으로 해당 아이디의 값을 가져온다
JPA는 save를 할 때 pk값도 같이 보내면 pk 값을 인지하고 새로 만드는 것이 아니라 해당 데이터를 찾아서 수정을 해준다
서비스
Entity클래스에 업데이트용 메서드를 만들어줘야함
내가 만든거
JSON을 이용해 만든 함수
JSON 사용시 주의사항 확인하기
saveDTO1에 만들어서 보내고
detailDTO2에 담아서 수정하고
detailDTO3에 다시 담아서 가져오고
saveDTO1와 detailDTO3을 비교해서 일치하지 않으면 성공!
request단계에서 확인을 하고 response로 보내준다?
홈페이지를 이동하기 전에 조건을 검색을 해서 일치하면 홈페이지로 보내주고 아니면 로그인 페이지로 보낸다
홈페이지를 누르면 WebConfig 파일이 실행이 되고
그 안에서 인터셉터 메서드를 불러와서 해당 인터셉터 메서드로 넘어가서
해당 인터셉터 메서드의 결과를 가져와서 해당 인터셉터가 실행이 되면 로그인 페이지로 넘어간다
@Configuration : 설정 정보를 스프링 실행시 등록 해줌
implements WebMvcConfigurer을 해줘야함!
@Override이기 때문에 똑같이 해야함
InterceptorRegistry : 인터셉터를 저장해주는 저장소?
.addInterceptor(new 체크인터셉트 메서드) : 만든 인터셉트 메서드를 가져온다
.order(숫자) : 해당 인터셉터가 실행되는 순서
.addPathPatterns(“/**”) : 해당 프로젝트의 모든 주소에 대한 인터셉트 적용
.excludePathPatterns(“주소1”,”주소2”) : 적은 주소는 예외
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에 저장해서 로그인하면 다시 꺼내서 사용한다
컨트롤러
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'
@Mapper 를 해줘야함, 인터페이스로 만들어야함
mapper에 있는 id와 메서드 이름을 같게 해야한다
어노테이션을 이용해서 직접 하는 것 두가지가 있다
위치
mapper 태그 namespace는 맵퍼리포지토리를 지정해 주면 된다
abstract : 추상 클래스
@CreationTimestemp : 만들어 질 때 입력이 되는 시간
@Column(updatable = false) : 업데이트 때는 수정이 안됨
@Column(insertable = false) : 인설트 할 때는 입력이 안됨
BaseEntity를 상속 받아서 가져와야함
Entity에서 가져올 때 시간을 둘중에 하나만 가져오려면 insert시에는 updateTime이 입력이 안되니 updateTime이 null이라면 createTime을 입력한다
BoardPagingDTO
페이징용 DTO를 만들어준다 그냥 디테일로 해도 상관 없는듯
PagingConst
페이징용 상수 클래스를 하나 만들어준다
그냥 컨트롤러에서 해도 될거같기도 하고
잘 안보이네 ㅠ
.map() : Entity클래스를 안에서 DTO로 바꿔주는 기능 같은 느낌?????
리스트는 따로 가져오고
startPage와 endPage는 따로 컨트롤러에서 계산을 해서 보내줘야 함
startPage는 전에 쓰던거랑 비슷한데
endPage는 삼항연산자를 써서 그런가 조금 어렵긴한데 비슷한 느낌
페이지카운트 메서드를 안쓰고 페이징 메서드로 한번에 다 구해와서 더 편한?
타임리프에서도 삼항연산자를 써서 사용하네
html에서 타임리프로 작성하는 주소값 /board(page=1) 이런식으로 보낸다
그럼 여러개 보내면 /board(page=1, var=1) 이건가 /board(page=1 & var=1)이건가
찾아보니 쉼표로 구분 한다고 한다
boardList.first = isFirst()
boardList.number = getNumber()
내가 만들어서 조금 이상하다
이게 맞는 건가
타입을 나누는 방법을 리포지토리에서 하려고 했는데 어려워서 포기함 ㅠㅠ
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 : 데이터 & 상태코드를 함께 리턴할 수 있음
@ResponseBody : 데이터를 리턴 할 수 있음
상태코드 : 200, 400, 404, 405, 500등
리턴 타입을 ResponseEntity로 하고
리턴을 ResponseEntity<보낼 데이터 타입>(보낼 데이터, 보낼 상태);로 해서 보내면 된다
나머지는 ajax를 사용할 때 와 같다
Es6 자바스크립트
const 함수이름 = (매개변수) =>{
실행 내용
}
위 방식으로 function대신해서 만들 수 있다
import static org.junit.jupiter.api.Assertions.*;
assertThat과 임포트가 다르다
session.getAttribute(‘이름’); 을 하면 object 형식으로 가져온다
그래서 (String)으로 강제 형변환을 해줘야 한다
JSON타입으로 ajax를 사용하려면
contentType: ‘application/json’,을 추가 해줘야한다
JSON 형식으로 컨트롤러에서 받을 때는 @RequestBody를 추가해서 DTO를 받아야한다
optional타입으로 받아서 if문으로 데이터가 있는지 없는지 확인을 하고
데이터가 있다고 판단이 되면 데이터를 가져온다
유닛 테스트 : 기능별로 테스트하는 것
삼항연산자 : 자바에서 쓰이는 기초 연산자이다
위의 if문과 아래 삼항연산자는 같은 공식이다
쿼리스트링 : 주소에 ?를 사용해서 값을 보내는 방식
체인메서드
해당 메서드처럼 줄줄이 이어져있는 메서드를 체인메서드라고 한다