Java

    Mybatis - SAXParseException: The content of elements must consist of well-formed character data or markup 원인과 해결법

    개요Mybatis로 작성한 쿼리문에서 발생한 에러이다. 내용을 해석해보면 다음과 같다. SAXParseException : 내용은 올바른 형식의 문자 데이터 또는 마크업으로 구성되어야 합니다. 아래는 SAXParseException 에러가 발생한 쿼리 예시이다. 쿼리로서만 보면 문제 있어 보이지 않는다. 그럼 어떤게 문제였을까?SELECT NAMEFROM USERSGROUP BY NAMEHAVING SUM(CASE WHEN SEX = 'M' THEN 1 ELSE 0 END)  개발 환경Java 8Spring 2.xMavenOracleMybatisIntelliJ 원인우선 SAX를 알아보자 SAX는 "Simple API for XML"의 약자로 이벤트 기반 XML 파싱해주는 기능을 한다.SAXParseExc..

    Java - File로 파일 목록 이름 조회하기

    개요 프로젝트 중 현재 날짜를 기반으로 해당 기간에 해당되는 JSP를 호출할 필요가 있었다. 하지만 임시로 사용되는 기능이었기 때문에 DB를 사용할 수 없었다. 그래서 JSP 네이밍 패턴을 아래와 같이 작성한 후 현재 날짜가 시작일과 마감일 사이라면 해당 JSP를 호출하도록 하려고했다. {시작일}_{마감일}{이름}.jsp 0101_0131JspView.jsp 특정 경로의 파일 목록을 어떻게 가져 올 수 있을까? java.io.File Java에서는 File 클래스를 통해서 파일과 디렉토리를 제어할 수 있다. 파일 생성, 읽기, 수정 및 삭제 등 여러가지 기능을 제공한다. 내가 필요한건 java 프로젝트의 jsp 디렉토리에 있는 jsp 파일 이름들이 필요하다. import java.io.File; publ..

    Java - @JasonCreator로 DTO에서 유연하게 Enum Type 받기

    프로젝트를 하다가 DTO로 Enum타입을 바로 받을 수 있을지 궁금했다. 기존에는 아래 코드처럼 DTO에서 Enum을 사용하려면 String으로 데이터를 받은 뒤, 해당 String 값으로 Enum 객체를 생성해줘야 했다. 이 방식은 2가지 불편한 점이 있었는데, @Getter @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public static class SignUp { @NotNull(message = "성별을 선택해야 합니다.") private String gender; } @AllArgsConstructor public enum Gender implements EnumType { MALE("남자"),..

    Java - 커스텀 애너테이션으로 유효성 검사하기

    배경 프로젝트를 진행하다 보면 여러 가지 유효성 검사를 해야 한다. 가령 회원가입을 한다고 한다면 email과 password의 유효성 검사를 해주어야 한다. email은 Java에 내장되어 있는 이메일 유효성 검사용 @Email 애너테이션이 있지만 password는 직접 정규표현식을 짜서 유효성 검사를 해주어야 한다. 만약 password 유효성 검사를 다른 곳에서도 써야 한다면 기다란 정규표현식을 반복해서 작성해야한다. 이럴 때 password 유효성 검사를 담긴 애너테이션을 만들면 재사용성과 생산성이 높아질 것이다. @Getter @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public static c..

    Java - 제네릭(Generic)과 함께하는 리팩토링

    배경 현재 프로젝트에서 짜면서 테스트 클래스에서 반복적으로 사용하는 기능들은 추상화해서 사용하고 있다. AuthIntegrationTest @Test @DisplayName("로그인 성공") void loginSuccessTest() throws Exception { // given LoginDto loginSuccessDto = StubData.MockMember.getLoginSuccessDto(); LoginResponse expectedResponseDto = StubData.MockMember.getLoginResponseDto(); // when String uri = UriComponentsBuilder.newInstance().path(BASE_URL + "/login") .build()...

    Java - @NotNull, @NotEmptty, @Notblank 차이점 알고 쓰시나요?

    새롭게 프로젝트를 진행하면서 유효성 검사를 위해 사용했던 애너테이션들의 정확한 역할 구분이 필요했다. 자바에서 @NotNull, @NotEmpty, @NotBlank는 모두 유효성 검증(validation)을 위해 사용되는 애너테이션이다. 이번에 각 애너테이션의 차이를 확실히 알고 용도에 맞게 사용해보자 @NotNull @NotNull은 매개변수, 필드 또는 메서드 반환 값이 Null인지 체크하는 데 사용된다. NullPointerException이 발생하지 않도록 하는 데 사용된다. null을 제외한 “”, “ “과 같은 빈문자열은 허용한다. @NotNull String test1 = null; // false @NotNull String test2 = ""; // true @NotNull String..

    Java - AES-128 양방향 암호화하기

    RefreshToken을 쿠키로 전달할 때 보안을 강화하기 위해 AES128 양방향 암호화를 적용했다.RefreshToken은 사용자가 재인증할 필요 없이 새로운 AcessToken을 발급받도록 해준다. 만약 해커가 RefreshToken을 가로채면 암호를 사용자의 계정에 접근하는데 사용할 수 있다. 이 때, AES128 암호화로 RefreshToken을 암호화하면 RefreshToken을 가로채더라도 사용하기 어려워진다. (물론 이 방법 또한 완벽하지 않다.)AES(Advanced Encryption Standard) 암호화저장중이거나 전송하려는 데이터를 보호하는 데 사용되는 대칭 암호화 알고리즘. 고정된 크기의 데이터 블록에 데이터를 암호화하는 블록 암호 암호화 알고리즘이다.AES 암호화는 ..

    Java - String 메소드 총정리!

    계속 추가중입니다. split() 지정된 분리자(regex)를 기준으로 문자열을 자르고 문자열 배열에 담아 반환해주는 메서드 String[] split(String regex) String[] split(String regex, int limit) 분리자(regex)으로 문자열 패턴을 받고, 패턴과 동일한 문자열을 기준으로 잘라준다. limit은 문자열을 나눌 수 있는 최대 개수이다. 예제 String str = "010-1234-5678-9101"; String[] result1 = str.split("-"); String[] result2 = str.split("-", 2); String[] result3 = str.split("-", 3); //결과 result1 = [010, 1234, 5678,..