시간을 대소비교 할 때는 숫자로 비교하는 것이 가장 편하기 때문에 기존 member_auth의 expire_dtm의 데이터 타입을 INT로 변경했더니 회원 가입을 할 떄 오류가 발생한다.MemberAuthDao.javaData truncation이라는 단어에서 알 수
/auth/joinPage.do를 요청했을 때 오류가 발생한다.join.jsp스프링 프레임워크 form 태그 라이브러리의 modelAttribute는 폼에 있는 요소들의 값을 채우기 위한 객체를 지정해주는 속성 중 하나이다. 오류 메시지를 살펴 보면 joinForm이
/auth/emailAuth.do를 요청했을 때 오류가 발생한다.JoinController.java위 문제 상황은 쿼리 파라미터의 uri의 값이 null이기 때문에 발생하는 것이다. 이를 방지하기 위해서 아래와 같이 uri의 값에 기본값 ""을 할당했다.하지만 이와 같
로그인 페이지에서 아이디 또는 패스워드만 입력했을 때 각각의 필드에 공백일 수 없습니다 메시지와 로그인 실패 메시지인 아이디 또는 비밀번호가 맞지 않습니다.가 동시에 보인다.없음.LoginController.java애초에 로그인 폼의 입력이 잘못된 경우 그 이후 단계가
회원가입하지 않은 아이디로 로그인을 시도했을 때 다음과 같은 예외가 발생한다.MemberController.java에러에 대한 설명을 공식 문서에서 살펴 보니 다음과 같다.해당 예외는 사용자의 입력값으로 인해 발생했기 때문에 사용자에게 알려주어야 한다. 예외가 발생하면
로그인을 하지 않은 상황에서 로그인 후에만 가능하도록 제한한 기능에 접근하려고 할 때 다음과 같은 오류가 발생한다.LoginFilter.java 일부필터는 서블릿에서 지원하는 기능으로 HTTP 요청이 올 때 해당 요청으로 서블릿을 호출하기 전에 처리하는 전처리 작업과
/forum//notice/listPage.do?page=1&size=10의 query string에서 만약 값을 넘겨주지 않는다면 다음과 같은 에러가 발생한다.startBoardSeq 시작할 게시물 번호를 구하기 위해 String에서 Integer로 변환을 시도한다.
EL은 객체의 값을 ${객체주소.필드}와 같이 조회할 때 해당 클래스에 getter가 있는지 확인한다. 없는 경우 위와 같은 에러가 발생한다. 따라서 Pagination에 getPostsPerPage() 메서드를 추가해주었다.
페이지네이션을 사용하는 list.jsp의 일부가 표시되지 않고 다음과 같은 오류 메시지가 발생한다.Pagination.java 일부list.jsp의 일부Lombok의 @Getter 애너테이션은 boolean 타입의 필드를 is\[앞 글자를 대문자로 변경한 필드의 이름]
공지사항 게시글 작성에서 제목과 내용을 작성 후 전송 버튼을 눌렀더니 다음과 같은 오류가 발생했다.RestNoticeController.java 일부BoardWriteDto.java 일부@NotEmpty, @NotBlank와 같은 검증 애너테이션은 Integer에 사용
보안 강화: SSH 키는 비밀번호보다 보안이 뛰어나며 브루트 포스 공격에 덜 취약합니다.편리성: 비밀번호를 반복해서 입력할 필요가 없어서 더 빠르고 편리하게 리포지토리에 접근할 수 있습니다.자동화: CI/CD 파이프라인 등 자동화된 시스템에서 인증을 쉽게 관리할 수 있
목적: 새로운 기능을 개발하기 위한 브랜치입니다.네이밍: feature/기능명 형식으로 브랜치를 생성합니다.생성 시점: 기능 개발이 시작될 때마다 생성하며, develop 브랜치에서 분기됩니다.특징: 개발 작업이 완료되면 develop 브랜치로 병합됩니다.목적: 프로덕
<type>: 커밋의 종류를 나타냅니다.feat: 새로운 기능 추가fix: 버그 수정docs: 문서 변경 (예: README.md 수정)style: 코드의 포맷팅, 세미콜론 누락 등 스타일 변경refactor: 코드 리팩토링 (기능 변경 없이 코드 구조 변경)te
LocalValidatorFactoryBean 을 글로벌 Validator로 등록한다. 이 Validator는 @NotNull 같은 애노테이션을 보고 검증을 수행한다. 이렇게 글로벌 Validator가 적용되어 있기 때문에, @Valid , @Validated 만 적용
Spring Framework의 BindingResult 인터페이스에서 제공하는 메서드 reject(), rejectValue()를 통해 ObjectError, FieldError를 직접 생성하지 않고 검증 오류를 다룰 수 있다.field: 오류가 발생한 필드의 이름e
이 설정을 통해 JavaMailSenderImpl 객체가 생성되고 이를 통해 이메일 전송을 위한 SMTP 서버와 연결할 수 있게 됩니다.host: 이메일을 전송할 SMTP 서버의 호스트 주소port: SMTP 서버의 포트 번호username: SMTP 서버에 로그인할
이 설정을 통해 암호화 설정 정보를 담은 EnvironmentPBEConfig 객체가 생성됩니다.algorithm: 사용할 암호화 알고리즘. PBEWithMD5AndDES는 MD5 해시와 DES 암호화 알고리즘을 사용하는 패스워드 기반 암호화(PBE) 알고리즘입니다.p
name: 주입 받을 JoinDao의 필드(멤버 변수) 이름ref: JoinDao의 필드(멤버 변수) dataSource의 참조value: 생성자의 파라미터 이름 senderEmail의 인자로 올 값
JoinController.java의 join()에서 리다이렉트를 하는 이유는 무엇일까? 만약 리다이렉트를을 하지 않았다고 해보자. 회원 가입을 한 페이지에서 새로 고침을 한 후 DB를 확인 해보면 회원이 또 추가됐다는 것을 알 수 있다. 새로고침을 할 때마다 기존 입
EmailUtil.java의 메서드 sendMail()을 보면 메서드가 오버로딩 되어있는 것을 볼 수 있다. 왜 그런 것일까?회원이 클릭할 수 있는 링크가 담긴 이메일을 받기 위해서는 이메일 본문을 HTML 태그 형식으로 보내야 한다. 그렇게 하기 위해서는 우선 Mim
웹 애플리케이션에서 사용자 인증과 상태 유지를 위해 쿠키와 세션을 사용한다. 보안과 관리 측면에서 세션이 더 안전한 이유는 다음과 같다.문제점: 사용자가 쿠키 값을 임의로 변경할 수 있다.예시: Cookie: memberId=1을 Cookie: memberId=2로 변
public HttpSession getSession(boolean create);세션이 있으면 기존 세션을 반환세션이 없으면 새로운 세션을 생성해서 반환세션이 있으면 기존 세션을 반환세션이 없으면 새로운 세션을 생성하지 않고 null 을 반환
스프링은 데이터 접근 계층에서 발생하는 수많은 예외들을 추상화해 DB 기술에 종속적이지 않은 예외 계층을 제공하고 있다. 사실 JdbcTemplate을 사용하면 각 리포지토리 메서드에서 발생하는 여러 반복 작업을 대신해준다. 그 반복 작업에는 예외 발생시 스프링 예외
LoginController.java 일부
생성자를 통해 전체 게시물 개수, 현재 페이지 번호, 한 페이지 당 게시물 개수가 주어지면 전체 페이지 개수, 시작 페이지 번호, 끝 페이지 번호, 이전 & 다음 화살표 표시 여부가 차례로 정해진다.필요한 값: 전체 게시물 개수, 한 페이지 당 게시물 개수전체 게시물
위와 같은 쿼리를 사용하게 되면 페이지에 따라 보여지는 게시물 목록을 다르게 설정할 수 있다. 위 쿼리는 처음 20개 행을 건너 뛰고 10개의 행을 갖고 온다. LIMIT을 사용해 페이지마다 원하는 게시물을 갖고 오게하는 sql은 다음과 같다.참고로 OFFSET은 생략
식별: 부모 테이블에 데이터가 존재해야 자식 테이블에 데이터를 입력할 수 있음예) 자동차 테이블에서 자동차\_아이디가 pk일 때 바퀴 테이블에서 자동차\_아이디를 pk로 갖는 경우비식별: 자식 데이터는 부모 데이터가 없어도 독립적으로 생성될 수 있음예) 자동차 테이블에
다음은 REST API 요청 값을 검증하고 Bean Validation 예외를 처리하는 방법을 정리한 내용이다:Bean Validation에서 발생하는 예외를 처리하기 위해 @ControllerAdvice와 @ExceptionHandler를 사용하여 전역 예외 처리기를
| 어노테이션 | 설명 | 사용 경우 | 장점 | | ----------...
Spring MVC에서 RedirectAttributes는 리다이렉트 시에 데이터를 전달하기 위해 사용됩니다. 이때 데이터를 넘기는 방법으로 두 가지 메서드 addAttribute()와 addFlashAttribute()는 서로 다른 방식으로 데이터를 처리하고 전달합니
mybatis-spring 의존성 추가할 때 spring-context, spring-jdbc와 호환되는 버전을 확인하자. spring 버전 5.x.x와 호환되는 것을 확인할 수 있다.MyBatis가 DTO 클래스를 검색할 패키지를 지정합니다. 여기서는 com.port
회원가입이메일 인증
다음은 게시물 파일을 업로드 했을 때 저장해야 하는 값을 위한 논리 테이블이다.파일 형식은 파일을 다운로드 받을 때 인코딩할 방식을 정하는 content-type의 값으로 사용된다.저장 경로는 다음과 같이 URL, URI 방식으로 저장할 수 있다.다운로드 URL: ht
추상 클래스 AbstractView를 구현하고 renderMergedOutputModel()를 오버라이드 한다. 해당 뷰로 다운로드 받을 파일(file)과 원본 파일 이름(orgFileNm)을 보내주면 된다.BeanNameViewResolver는 빈 이름으로 뷰를 찾아
read.jsp ➭ NoticeController ➭ BoardService ➭ BoardAttachDao ➭ FileDownloadView<form> 태그 ➭ downloadMultipleFiles() ➭ findFileInfo(), makeZipFile() (
list.jsp의 navbar에서 표시하고 있는 페이지가 현재 페이지인가 아닌가를 구분하기 위해 다음과 같은 EL의 비교 표현을 사용한다.하지만 params.page와 현재 페이지가 일치함에도 계속해서 css에서는 반영이 안되었다. params.page는 문자열 값 p
게시물 단건 조회 시 좋아요/싫어요 반영 여부를 확인해야 한다. boardDao의 findIsLikeByBoardSeqAndBoardTypeSeqAndMemberSeq()를 통해 다음과 같은 sql 쿼리를 실행하게 된다.만약 해당 레코드가 없는 경우 다음과 같은 예외가
중복 아이디 체크도 이와 같은 문제가 발생한다고 언급 INSERT 쿼리만을 통해 게시물 별 좋아요/싫어요를 반영할 때 사용자가 처음으로 좋아요 또는 싫어요를 누를 때는 문제가 없었지만 그 다음 좋아요 또는 싫어요를 누를 때는 같은 문제가 발생했다.board_vote의
하지만 (1)과 같은 해결 방법은 좋아요/싫어요를 누를 때마다 예외 객체를 생성하는 문제가 발생한다. 이와 같은 예외 객체는 Stack과 Heap에 쌓이게 되는데 다량의 좋아요/싫어요 클릭이 발생할 경우 StackOverflow가 발생할 수도 있기 떄문에 다음과 같이
write.jsp 페이지 조회 후 브라우저 콘솔 창에 다음과 같은 오류를 확인했다. Uncaught ReferenceError: jQuery is not defined, Uncaught ReferenceError: $ is not definedhtml은 순차적으로 문서
다음은 read.jsp에서 좋아요 또는 싫어요 버튼을 누른 후 실행되는 성공 콜백 함수이다.위의 if-else-if문 중 어떤 블록도 수행되지 않음을 확인할 수 있었다. RestNoticeController의 vote()의 리턴 타입은 int지만 HTTP 메시지 컨버터
오늘이 만약 2024년 5월 15일인 경우 /file/2024/4/15라는 폴더가 생성된다.Calendar의 JANUARY 상수는 0이기 때문에 month의 값을 구할 때 +1을 해주었다.
위 필터 설정은 필터가 직접 클라이언트로부터 오는 요청(DispatcherType.REQUEST)에 대해서만 호출되며, 이러한 요청이 "pf"라는 이름의 서블릿(DispatcherServlet)으로 향할 때만 적용된다는 것을 나타낸다.이 기준에 맞는 필터는 서블릿이 요
파일을 저장하는 경로를 config.properties에서 불러오는데 이 값이 계속해서 null로 지정된다.없음.../resource-local/config.propertiesFileUtil.java@Value 애너테이션은 BeanPostProcessor에 의해 처리되