Programming/Spring Framework

    [Jackson] 민감한 데이터를 JsonProperty를 통해 serialize, deserialize 하는 방법

    안녕하세요. 이번 포스팅은 클라이언트가 정보를 조회했을 때 모든 데이터를 보여주는 것이 아닌 Jackson 라이브러리를 사용해서 필요한 데이터만 보여주는 방법에 대해 소개하겠습니다. 아래의 User 클래스가 있다고 가정하겠습니다. @Data // lombok public class User { private int id; private String userId; private String password; } 클라이언트가 어떤 회원에 대한 정보를 조회하기 위해 GET 요청을 했을 때 아무런 조치를 하지 않는다면 id, userId, password를 모두 조회할 수 있게 됩니다. password는 중요한 정보이기 때문에 보여주면 문제가 발생합니다. 스프링부트에서는 Jackson 라이브러리를 기본적으로 갖..

    [스프링] MultipartFile 인터페이스를 활용한 다중 파일 업로드

    [스프링] MultipartFile 인터페이스를 활용한 다중 파일 업로드

    과거엔 HttpServletRequest 인터페이스를 상속받은 MultipartHttpServletRequest 인터페이스를 활용하여 파일을 업로드 할 수 있었습니다. MultipartHttpServletRequest를 사용해서 파일 업로드를 구현할 수 있지만 스프링이 제공해주는 MultipartFile 인터페이스를 활용함으로써 더욱 쉽게 파일을 단일, 다중으로 업로드를 할 수 있습니다. 공통적으로 사용하는 HTML은 아래와 같습니다. 타임리프를 사용했습니다. 상품 등록 폼 상품 입력 상품명 파일 파일2 파일을 2개 보낼 수 있습니다. type은 file로 해야 MultipartFile이 인식을 할 수 있으며 각각의 파일을 구분지어야 하므로 name은 file, file2로 달라야 합니다. input 옵..

    [스프링부트] MockMvc Test 2가지 방법

    스프링부트에서는 MockMvc로 테스트를 하는 방법에는 두 가지가 있습니다. 1. @SpringBootTest와 @AutoConfigureMockMvc UserController가 존재한다고 가정해보겠습니다. @SpringBootTest @AutoConfigureMockMvc class UserControllerTest() { @Autowired private MockMvc mockMvc; @Test void register() { // todo: ... } } 스프링부트에서는 Test 클래스를 만들면 @SpringBootTest 어노테이션만 붙어 있습니다. MockMvc로 테스트를 하기 위해서는 @AutoConfigureMockMvc를 추가적으로 붙여야 합니다. 주의할 점은 Test 클래스에서는 Moc..

    [스프링부트] Tiles, JSP 사용을 위한 Dependency 설정 및 JSP 수정사항 자동 반영하기

    [스프링부트] Tiles, JSP 사용을 위한 Dependency 설정 및 JSP 수정사항 자동 반영하기

    타일즈 및 JSP 사용을 위한 Dependency 설정 스프링부트 2.x 기준으로 타일즈를 설정할 때는 아래와 같이 3개의 dependency가 필요하다. 1. 스프링부트에서는 JSP 사용을 권장하지 않아 JSP를 사용하려면 추가적인 org.apache.tomcat.embed dependency가 필요하다. 2. 타일즈를 사용하기 위해서는 jstl을 dependency가 필요하므로 추가해주면 된다. 3. 타일즈 dependency를 추가한다. org.apache.tomcat.embed tomcat-embed-jasper javax.servlet jstl 1.2 org.apache.tiles tiles-jsp 3.0.7 JSP 수정 시 자동 반영 JSP를 수정했을 때 톰캣을 다시 시작하는 것은 정신건강에 ..

    [스프링] HandlerMethodArgumentResolver에 대해 알아보자

    [스프링] HandlerMethodArgumentResolver에 대해 알아보자

    스프링을 사용할 때 @ModelAttribute, @RequestBody 등 어노테이션을 컨트롤러 단에서 메서드의 매개변수로 넣어서 많이 사용해왔다. 위의 어노테이션들이 메서드의 매개변수로만 쓰이는 이유도 모른채 기계적으로 사용해온 나를 반성한다... 커스텀한 어노테이션을 만들고 이를 메서드의 매개변수에서 활용하면서 관련된 개념을 짚고 넘어가고자 한다. HandlerMethodArgumentResolver HandlerMethodArgumentResolver는 @PathVariable, @RequestParam와 같은 메서드의 여러 인자 값을 처리해주는 역할을 한다. 스프링 프레임워크가 제공하는 인터페이스이다. 참고로 @PathVariable 어노테이션은 PathVariableMethodArgumentR..

    [스프링부트] AWS S3에 파일 업로드 하기

    [스프링부트] AWS S3에 파일 업로드 하기

    회사에서는 자체 프레임워크로 손쉽게 S3에 이미지를 업로드할 수 있고 업로드가 성공 또는 실패했을 때 반환되는 JSON 객체 결과를 그냥 써오기만 했다. 그냥 쓰는 것과 어느정도의 이해를 하고 쓰는 것은 차이가 크기 때문에 정리를 해보고자 한다. 나는 이미지 등의 파일을 선택했을 때 즉시 S3 Bucket으로 이미지가 업로드되도록 해보려 한다. html은 input 한 줄이면 된다. application.properties에 aws 정보를 설정한다. aws.s3.accesskey=[본인의 accesskey] aws.s3.secretkey=[본인의 secretkey] aws.s3.bucket=[s3 bucket name] accesskey, secretkey가 노출되어 타인이 악용한다면 과금될 수 있다. ..

    [스프링부트] fetch api post 전송 방법

    로그인을 할 때 아이디, 비밀번호를 입력하고 로그인 버튼을 누른다. 서버에서는 입력된 아이디, 비밀번호를 데이터베이스와 비교하여 일치 여부를 판단한다. 이번 포스팅에서는 아이디, 비밀번호가 불일치일 때 페이지 전환 없이 ajax를 활용하여 처리해보고자 한다. fetch api에서 post 방식을 사용할 것이다. window.addEventListener('load', (e) => { const loginBtn = document.querySelector('.login-btn'); const form = document.querySelector('.form'); loginBtn.addEventListener('click', (e) => { e.preventDefault(); // 기본 폼 동작 막기 let..

    [스프링부트] @JsonNaming, @JsonProperty는 언제 사용할까?

    @JsonNaming, @JsonProperty의 사용법을 소개하기에 앞서 사용할 코드를 작성하도록 하자. json으로 넘어오는 값이 아래와 같다고 가정하자(post든 put이든 ..) { "my_name": "kevin", "my_age": 20, "my_country": "korea" } 자바 Entity는 다음과 같다고 가정하자. @Data public class Student { private String myName; private String myAge; private String myCountry; } 컨트롤러는 다음과 같다. @RestController @RequestMapping("/api") public class StudentController { public void post(@Re..

    [스프링] IoC Container에 Bean 객체가 등록되는 방법 두 가지를 알아보자

    [스프링] IoC Container에 Bean 객체가 등록되는 방법 두 가지를 알아보자

    스프링 IoC 컨테이너와 여기에 Bean 객체를 등록하는 방법을 알아보겠습니다. 스프링 IoC 컨테이너 스프링에서는 객체를 생성하여 이를 담을 그릇이 필요한데 이러한 그릇을 컨테이너라고 합니다. 객체(부품)를 조립할 때 작은 객체부터 큰 객체 순으로 조립을 해나간다. 작은 객체끼리 결합 -> 더 큰 객체와 결합 -> ... 이런 순으로 부품 조립 순서라면 이 순서이다. 객체를 생성할 때는 일체형과 결합형이 있습니다. 일체형에서는 다음과 같은 순서입니다. A 객체를 만들 때 B를 만들고 B를 만들 때 C를 만들고 ... 이러한 과정입니다. 스프링에서는 객체를 결합형으로 만듭니다. 결합형에서는 순서는 다음과 같습니다. 객체가 생성되고 결합되는 순서는 D -> C -> B -> A 순으로 역순입니다. 이렇게 ..

    [스프링] DI(Dependency Injection) 의존성 주입에 대해 알아보자

    [스프링] DI(Dependency Injection) 의존성 주입에 대해 알아보자

    이번 포스팅은 DI에 대해 알아보겠습니다. 의존성(Dependency)은 어떤 하나의 대상이 다른 대상에 의존하는 것을 의미합니다. 예를 들어, A는 B라는 객체를 부품으로 갖고 있습니다. 즉, A, B 클래스는 Has a 상속 관계입니다. 그렇다면 DI를 해야하는 이유가 무엇일까요? DI를 하지 않으면 객체와 객체간의 결합력이 강하기 때문에 객체를 바꿔 끼우는 과정에서 많은 수정을 해야하는 번거로움이 있기 때문입니다. 이해를 위해 아래 예제를 보겠습니다. public class A { private B b; public A() { this.b = new B(); } public void printHello() { this.b.hello(); } } 위 코드와 같이 A 클래스에서 printHello 메서..