728x90

Spring Test MockMvc의 한글 깨짐 처리

스프링에서 테스트 코드를 작성할 때 MockMvc를 흔히 사용한다.

대략 아래와 같이 설정하고 사용한다.

변경일자 2022-04-19 수정
MockMvc를 보통 테스트코드를 작성할 때 사용할텐데,

@WebMvcTest를 사용해서 mvc를 위한 테스트를 만들 수 있다.

//@SpringBootTest  
@WebMvcTest(ApiController.class)  
public class ApiControllerTest {  

    private MockMvc mockMvc;  

    @Autowired  
    private WebApplicationContext ctx;  

    @BeforeEach  
    public void setup() {  
        this.mockMvc = MockMvcBuilders.webAppContextSetup(ctx)  
                .alwaysDo(print())  
                .build();  
    }  

    @Test  
    public void aaa() throws Exception {  
        String keyword = "sports";  

        MvcResult result = this.mockMvc  
                .perform(  
                        get("/api/search/" + keyword)  
                )  
                .andExpect(status().isOk());  
    }  
}  

위의 테스트 코드에서는 한글이 없으므로 아무 문제가 없는데, 아래와 같이 한글을 사용하면 깨진 한글이 Controller에 유입될 수 있으며, 결국 원하는 대로 동작하지 않게 된다.

    @Test  
    public void aaa() throws Exception {  
        String keyword = "스포츠";  // 한글 사용  

        MvcResult result = this.mockMvc  
                .perform(get("/api/search/" + keyword))  
                .andExpect(status().isOk());  
    }  

이 문제는 `MockMvc`를 설정할 때 `CharacterEncodingFilter`를 추가해주면 쉽게 해결할 수 있다.

    @Before  
    public void setup() {  
        this.mockMvc = MockMvcBuilders.webAppContextSetup(wac)  
                .addFilters(new CharacterEncodingFilter("UTF-8", true))  // 필터 추가  
                .alwaysDo(print())  
                .build();  
    }  
728x90

'Spring' 카테고리의 다른 글

Spring -> Spring Boot 마이그레이션  (0) 2022.08.05
[Spring] MockMvc Bean 주입 에러  (0) 2022.08.04
[Spring] Spring Security  (0) 2022.08.03
의존성 주입 어노테이션 정리  (0) 2022.08.03
728x90

Call By Value(값에 의한 호출)

call by value 는 가장 일반적인 함수 호출형태로 값을 복사하는 것이다.

예시

public class CallByValue{
    public static void swap(int x, int y){
        int temp = x;
        x = y;
        y = temp;
    }

    public static void main(String[] args){
        int a = 10;
        int b = 20;

        System.out.println("swap() 호출 전 : a = " + a + ", b = " + b);

        swap(a, b);
        System.out.println("swap() 호출 후 : a = " + a + ", b = " + b);
    }
}

결과는 아래와 같다

swap() 호출 전 : a = 10, b = 20
swap() 호출 후 : a = 10, b = 20

이유는 swap() 메서드 호출 시 사용한 인자 a, b와 swap() 메서드내의 매개변수 x, y는 서로 다르다.
memory

main()에서 선언 된 변수 a와 b가 각각 메모리의 0x0001번지와 0x0005번지에 할당 되었다고 가정 할당 된 메모리 변수에는 각각 10과 20의 값이 저장된다. 이후, swap() 메서드 호출 시에 사용한 인자 a와 b는 할당 된 메모리 주소가 아닌 메모리에 담겨져 있던 값만이 복사되어 swap() 메서드 내부의 매개변수 x와 y의 메모리 주소에 담겨지게 된다. 당연하게도 swap() 메서드가 수행하는 동안 사용되는 변수들은 main()에 존재하는 a와 b가 아닌 swap() 내부에 새로 생성 된 x와 y이기 때문에 메서드 수행 후에도 결과 값에 변화가 없다.

Call By Value는 메서드 호출 시에 사용되는 인자의 메모리에 저장되어 있는 값(value)을
복사하여 보낸다.

Call By Reference

Call by reference는 메서드 호출 시에 사용되는 인자가, 값이 아닌 주소(Address)를 넘겨줌으로써, 주소를 참조(Reference)하여 데이터를 변경할 수 있다.

public class CallByReference{
    int value;

    CallByReference(int value){
        this.value = value;
    }

    public static void swap(CallByReference x, CallByReference y){
        int temp = x.value;
        x.value = y.value;
        y.value = temp;
    }

    public static void main(String[] args){
        CallByReference a = new CallByReference(10);
        CallByReference b = new CallByReference(20);

        System.out.println("swap() 호출 전 : a = " + a.value + ", b = " + b.value);

        swap(a, b);

        System.out.println("swap() 호출 후 : a = " + a.value + ", b = " + b.value);
    }
}

결과

swap() 호출 전 : a = 10, b = 20
swap() 호출 후 : a = 20, b = 10

memory2

main()에서 선언 된 CallByReference 타입의 변수 a와 b는 각각 객체를 생성하여 0x0001번지와 0x0005번지에 저장된 10과 20의 주소 값을 저장하게 된다. 이후, swap() 메서드 호출 시에 인자 a와 b는 메모리에 저장 된 주소 값을 복사하여 매개변수 x와 y의 메모리에 저장한다. 결국 swap() 메서드는 10과 20이 저장 된 0x0001번지와 0x0005번지의 주소를 참조하여 연산하기 때문에, 연산 결과에 따라 원본 데이터가 변하게 된다. main()에서 선언 된 변수 a와 b는 각각 0x0001번지와 0x0005번지를 가리키고 있기 때문에 변한 데이터를 불러들여 결과 값이 변하게 된다.

Call By Reference는 메서드 호출 시 사용되는 인자 값의 메모리에 저장되어 있는 주소(Address)를 복사하여 보낸다.
728x90

'Java' 카테고리의 다른 글

[Java] Enum  (0) 2022.08.03
[Java] Optional  (0) 2022.08.03
Java Stream API  (0) 2022.08.03
[Java] 디자인패턴 - 싱글톤 패턴  (0) 2022.08.03
728x90

WAS(Web Application Server)

1. WAS란?

웹 브라우저와 같은 클라이언트로부터 웹 서버가 요청을 받으면 애플리케이션에
대한 로직을 실행하여 웹 서버로 다시 반환해주는 소프트웨어
웹 서버와 DBMS 사이에서 동작하는 미들웨어로서 컨테이너 기반으로 동작한다.

2. WEB서버와 WAS의 동작 과정

image1

3. WEB 서버와 WAS의 차이점

  • 요청을 받아 처리하는 컨텐츠의 차이
    • 웹서버의 경우 : 정적인 컨텐츠(HTML, CSS, IMAGE 등)을 요청받아 처리
    • WAS의 경우 동적인 컨텐츠(JSP, ASP, PHP 등)를 요청받아 처리

4. WEB서버와 WAS를 나눠야하는 이유

WAS의 경우 웹서버 + 웹 컨테이너의 개념이라 웹 서버가 없더라도 웹 서버의 역할을 동시에 수행이 가능하다.
그래서 웹 서버를 사용하지 않더라도 웹 서비스를 할 수 있지만 웹 서버와 WAS를 나눠서 사용한다.

이유
  1. 데이터 처리 방식

    웹 서버는 정적인 컨텐츠를 처리하고 WAS는 동적인 컨텐츠를 처리한다.

  2. 보안

    사용자들에게 WAS는 공개될 필요가 없음

    위동작에서 사용자에게 요청은 웹 서버가 받고 그 요청을 WAS에 전달한다.

    그리고 WAS의 경우 DB서버에 대한 접속 정보가 있기 때문에 외부로 노출될 경우 보안상 문제를 야기할 수 있다.
    그래서 웹 서버의 경우 DMZ구간에 위치하고 WAS는 내부망에 위치시켜 보안을 유지할 수 있다.

DMZ란? - 내·외부 네트워크 구간 사이에 위치한 중간지점으로, 침입차단시스템 등으로 접근 제한
         등을 수행하지만 외부 네트워크에서 직접 접근이 가능한 영역을 뜻합니다.
728x90

+ Recent posts