Skip to content

2022_04_09

Crow edited this page Apr 10, 2022 · 11 revisions

other

로그 처리 문제 발생

register페이지 작성중 로그가 안찍히는 문제를 찾아냄
로그가 안찍히는 문제는 시스템 구동상엔 큰 문제는 아님
하지만 유지 보수 측면에서 보면 큰 문제가 됨
웹이 어느 부분까지 작동하는지 어느 부분에서 버그가 생긴건지 알아보기 위해서 꼭 고쳐야함

로그 처리 문제 해결 방법

그렇게 큰 문제는 아니고 그냥 내가 처음에 프로젝트를 구성할때 test패키지 쪽 resources/log4j.xml에는 jdbc드라이버 로그레벨을 설정해줌
그렇지만 main패키지 쪽 resources/log4j.xml에는 jdbc 드라이버 로그 레벨 설정은 누락함

<!-- 2022-01-8 log level설정부분 -->
    <!-- 2022-02-11 로그 레벨을 설정하려면 mybatis버전을 3.4.6에서 3.5.4로 변경해야함 -->
    <logger name="jdbc.audit">
        <level value="warn" />
    </logger>

    <logger name="jdbc.resultset">
        <level value="warn" />
    </logger>

    <logger name="jdbc.connection">
        <level value="warn" />
    </logger>

참고한 곳과 피드백

이번 문제는 그냥 두개의 log4j.xml을 비교해본결과 쉽게 결과를 도출해서 딱히 참고한
사이트는 없음
피드백은 언제나 설정이 가장 중요하기 때문에 최대한 익숙해 지도록 노력하고
또 요즘 트렌드를 따라서 설정을 java로 처리해야 하므로 다음부턴 xml대신
최대한 자바 설정을 사용하도록 노력해야함

11.3.1 한글 문제와 UTF-8 필터 처리

새로운 게시물을 등록했을 때 만일 한글 입력에 문제가 있다는 것을 발견했다면

  1. 브라우저에서 한글이 깨져서 전송이되는지를 확인하고
  2. 문제가 없다면 스프링 MVC쪽에서 한글을 처리하는 필터를 등록해야함

브라우저에서 전송되는 데이터는 개발자 도구를 이용해서 확인할 수 있음
개발자 도구에서 Network 탭을 열어둔 상태에서 데이터를 보내면 해당 내용을 볼 수 있으므로
이때 POST 방식으로 제대로 전송되었는지, 한글이 깨진 상태로 전송된 것인지를 확인할 수 있음

위의 화면(p242 or 브라우저에서 Network탭으로 본 내가 전송한 데이터)을 보면
브라우저가 한글을 문제없이 보냈음을 알 수 있는데,
문제는 Controller혹은 DataBase쪽이라는것을 알 수 있음

BoardController와 BoardServiceImpl을 개발할 때는 이미 Lombok의 로고를 이용해서
필요한 기능들을 기록해 두었으므로, 이를 확인해야함

위의 로그(p242~243참고)를 살펴보면 BoardController에 전달될 때 이미 한글이 깨진 상태로
처리된 것을 볼 수 있음

이 문제를 해결하기 위해서web.xml에 라애와 같이 필터를 추가해야함

web.xml을 이용할 때의 UTF-8 필터

<!-- 37~50까지 WEB Encoding에 필터 처리 -->
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter
        </filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>encoding</filter-name>
        <servlet-name>appServlet</servlet-name>
    </filter-mapping>

Java 설정의 경우 web.xml을 대신하는 WebConfig 클래스에서는 필터를 getSerlvetFilters()를
재정의해서 처리할 수 있음

com.crow.config내의 WebConfig 클래스의 일부

	@Override
	  protected Filter[] getServletFilters() {
	    CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
	      characterEncodingFilter.setEncoding("UTF-8");
	      characterEncodingFilter.setForceEncoding(true);

	      return new Filter[] { characterEncodingFilter };
	  }

한글에 대한 처리가 끝난 후 다시 게시물을 작성해 보면 한글에 문제가 없이 입력되는 것을
확인할 수 있음

11.3.2 재전송(redirect)처리

등록 과정에서 POST 방식으로 처리되는 과정을 그림으로 표현한다면 다음과 같음
(P245)참고

BoardController에서 register() 메서드는 redirect:/board/list를 전송하는데
브라우저는 이를 통보 받은 후 /board/list로 이동하게 됨
만일 위와 같이 재전송을 하지 않는다면 사용자는 브라우저의 새로고침을 통해서
동일한 내용을 계속 서버에 등록할 수 있기 때문에(흔히 도배라고 표현) 문제가 발생함
브라우저에서는 이런 경우 경고창을 보여주기는 하지만 근본적으로 차단 하지는 않음

따라서 등록, 수정, 삭제 작업은 처리가 완료된 후 다시 동일한 내용을 전송할 수 없도록
아예 브라우저의 URL을 이동하는 방식을 이용함
이러한 과정에서 하나 더 신경 써야 하는 것은 브라우저에 등록, 수정, 삭제의 결과를
바로 알 수 있게 피드백을 줘야 한다는 점임
경고창이나 <div>를 이용하는 모달창을 이용해서 이러한 작업을 처리함

BoardController에서 redirect 처리를 할 때 RedirectAttributes라는 특별한 타입의
객체를 이용했음
addFlashAttribute()의 경우 이러한 처리에 적합한데,
그 이유는 일회성으로만 데이터를 전달하기 때문임
addFlashAttribute()로 보관된 데이터는 단 한번만 사용할 수 있게 보관됨
(내부적으로는 HttpSession을 이용해서 처리함)

list.jsp 페이지의 아래쪽에 <script> 태그를 이용해서 상황에 따른 메시지를 확인할 수 있음

views/board/list.jsp의 일부

<script type="text/javascript">
$(document).ready(function(){
	var result = '<c:out value="${result}"/>';
});
</script>

만일 새로운 게시물이 등록된 직후에 위의 코드는 다음과 같이 처리됨
(p246그림의 번호는 생성된 게시물의 번호임)

새로운 게시물의 번호는 addFlashAttribute()로 저장되었기 때문에 한 번도 사용된 적이 없다면
위와 같이 값을 만들어 내지만 사용자가 /board/list를 호출하거나, 새로고침을 통해서
호출하는 경우는 아래와 같이 아무런 내용이 없게 됨

addflashAttribute()를 이용해서 일회성으로만 데이터를 사용할 수 있으므로 이를 이용해서
경고창이나 모달창 등을 보여주는 방식으로 처리할 수 있음

11.3.3모달(Modal)창 보여주기

최근 브라우저에서 경고창(alert)을 띄우는 방식보다 모달창(Modal)을 보여주는 방식을
많이 사용함
BootStrap은 모달창을 간단하게 사용할 수 있으므로 목록 화면에서 필요한 메시지를
보여주는 방법을 사용해 보겠음
최종적인 형태는 p247쪽 그림과 같은 모습이됨

모달은 기본적으로<div>를 화면에 특정위치에 보여주고, 배경이 되는 <div>에 배경색을 입혀서 처리함
모달창은 활성화된 <div>를 선택하지 않고는 다시 원래의 화면을 볼 수 없도록 막기 때문에 메시지를 보여주는데
효과적인 방식임

모달창에 대한 코드는 다운로드한 SBAdmin2의 pages 폴더 내 notifications.html 파일을 참고하면 됨

모달창을 처리하기 위해서는 우선 <div>를 이용해서 페이지의 코드에 추가해야함
list.jsp 내에 <table> 태그의 아래쪽에 모달창의 <div>를 추가함

list.jsp 페이지의 수정

</table><!-- table태그의 끝-->
				
				<!-- Modal 추가 -->
				<div class="modal fade" id="mymodal" tabindex="-1" role="dialog"
				    aria-labelledby="myModalLabel" aria-hidden="true">
				    <div class="modal-dialog">
				        <div class="modal-content">
				            <div class="modal-header">
				                <button type="button" class="close" data-dismiss="modal"
				                aria-hidden="true">&times;</button>
				                <h4 class="modal-title" id="myModalLabel">Modal title</h4>
				            </div>
				            <div class="modal-body">처리가 완료되었습니다.</div>
				            <div class="modal-footer">
				                <button type="button" class="btn btn-default"
				                data-dismiss="modal">Close</button>
				                <button type="button" class="btn btn-primary">Save changes</button>
				            </div>
				        </div>
				        <!-- /.modal-content -->
				    </div>
				    <!-- /.modal-dialog -->
				</div>
				<!-- /.modal -->

<-- 2022_04_09 Modal관련 div를 만들긴 했지만 아직 모달창을 보여주는 작업도 안하고 소스에 대한 디버깅도 안해서 오류가 있을수 있으니 10일에 고치도록 하겠음 -->

EC2

서버설정
서버 리부팅

Controller 테스트 구현

MockMvc

코드로 배우는 스프링 웹 프로젝트 공부

코드로 배우는 스프링부트 웹 프로젝트 공부

Clone this wiki locally