2022 01 15&22 - oneso123456789/2022 GitHub Wiki

실습 외 내용

controller 패키지에 SampleController 클래스에 @Log4j어노테이션에 다음과 같은 오류 발생 org.apache.log4j.Logger cannot be resolved to a type

해결방법 pom.xml의 log4j부분 스코프 부분을 주석처리함 </exclusions>
<!-- <scope>runtime</scope> -->
</dependency>
runtime 스코프는 의존관계가 컴파일시는 필요하지 않지만, 실행시 필요하다고 명시하는것
따라서 실행 시와 테스트 클래스 패스에 속하지만, 컴파일 클래스 패스엔 속하지 않음
지금까지 log4j는 테스트 클래스 상에서만 사용했지만 이번엔 log4j를 main쪽에서 호출했기에
이런 문제가 야기됨. 위 링크의 스코프 내용 다 숙지하는게 좋아보임^오^
https://yjh5369.tistory.com/entry/Maven-Dependency%EC%97%90%EC%84%9C-scope%EC%9D%98-%EC%9D%98%EB%AF%B8

22일 복귀 핑계를 좀 데자면 한동안 아프고 일이 많아서 공부가 안잡혔음 다시 열심히 해야겠음..

DTO란

Data Transfer Object를 뜻하며 계층간 이동을 위한 자바 bins다
계층간이란 Controller, View, Business Layer, Persistent Layer이며 이 계층간의 데이터 교환을 위한 객체가 바로 DTO며 VO라고도 부른다.

계층구조와 설명은 아래 링크를 참조하자 https://postitforhooney.tistory.com/entry/Spring-MVC-%ED%8C%A8%ED%84%B4%EC%97%90%EC%84%9C%EC%9D%98-5%EA%B0%80%EC%A7%80-%EA%B3%84%EC%B8%B5%EC%97%90-%EB%8C%80%ED%95%9C-%EC%A0%95%EB%B3%B4-%ED%8D%BC%EC%98%B4

Array 사용법을 까먹음..

java arrays 등 기본을 다시 공부하는게 좋을꺼 같음
모든것을 알순 없지만 중요한건 기억해야함

스프링 MVC의 Controller

스프링 MVC를 이용하는 경우 작성되는 Controller는 다음과 같은 특징이 있음

  • HttpServletRequest, HttpServletResponse를 거의 사용할 필요없이 필요한 기능 구현
  • 다양한 타입의 파라미터 처리, 다양한 타입의 리턴 타입 사용가능
  • GET 방식, POST 방식 등 전송 방식에 대한 처리를 어노테이션으로 처리 가능
  • 상속/인터페이스 방식 대신에 어노테이션만으로도 필요한 설정 가능

다른 프레임 워크랑 다르게 스프링 MVC는 어노테이션을 중심으로 구성되기 때문에
예제 작성시 각 어노테이션의 의미에 대하여 최대한 이해하면서 해야함

@Controller, @RequestMapping

프로젝트내 com.crow.controller 패키지폴더에 SampleController라는 이름의 클래스 작성
SampleController의 클래스 선언부에는 @Controller라는 스프링 MVC에서사용하는 어노테이션을 적용하고 있음.

지정 패키지 스캔

작성된 SampleController 클래스는 자동으로 스프링 객체(Bean)으로 등록되는데
servlet-context.xml에 context:component-scan이라는 태그를 이용해서 지정된
패키지를 스캔하도록 설정되어있기 때문임.
해당 패키지에 선언된 클래스를 조사하면서 스프링에서 객체(Bean) 설정에 사용되는
어노테이션들을 가진 클래스들을 파악하고 필요하다면 이를 객체로 생성해서 관리함
<context:component-scan base-package="com.crow.controller" />
SampleController 클래스가 스프링에서 관리되면 클래스 옆에 작게 'S'모양 아이콘이 추가됨

클래스 선언부에는 @Controller와 함께 @RequestMapping을 많이 사용

@RequestMapping 어노테이션

@RequestMapping은 현재 클래스의 모든 메서드들의 기본적인 URL 경로가 됨.
예를들어 SampleController 클래스를 다음과 같이 '/sample/*'이라는 경로를
지정했다면 다음과 같은 URL은 모두 SampleController에서 처리됨.

  • /sample/aaa
  • /sample/bbb

또한 @RequestMapping 어노테이션은 클래스의 선언뿐만 아니라 메서드의 선언에도 사용할수있음

21일내용

SampleController는 Lombok의 @Log4j를 사용함
@Log4j는 @Log가 java.util.Logging을 이용하는데 반해 Log4j 라이브러리를 활용함
Spring LegacyProject로 생성한 프로젝트는 기본적으로 Log4j가 추가되어 있으므로 별도의 설정이 필요하지 않음. (위 내용은 틀린내용같음 @Log4j를 Java Main에서 사용시 pom.xml에 Log4j 부분에 스코프를 삭제하거나 주석 처리해야함)

@RequestMapping의 변화

@Controller 어노테이션은 추가적인 속성을 지정할 수 없지만, @RequestMapping의 경우 몇 가지의 속성을 추가할 수 있음 이 중에서도 가장 많이 사용하는 속성이 method 속성임, Method 속성은 흔히 GET 방식, POST방식을 구분해서 사용할때 이용함

스프링은 4.3버전 부터는 이러한 @RequestMapping을 줄여서 사용할 수 있는 @GetMapping, @PostMapping이 등장하는데
축양형의 표현이므로, 아래와 같이 비교해서 학습하는것이 좋음.

@RequestMapping은 GET, POST 방식 모두를 지원해야 하는 경우에 배열로 처리해서 지정할 수 있음
일반적인 경우에만 GET, POST 방식만을 사용하지만 최근에는 PUT, DELETE 방식 등도 점점 많이 사용하고 있음
@GetMapping의 경우 오직 GET 방식에만 사용할 수 있으므로, 간편하기는 하지만 기능에 대한 제한은 많은편임

Controller의 파라미터 수집

Controller를 작성할 때 가장 편리한 기능은 파라미터가 자동으로 수집되는기능임
이 기능을 사용하면 매번 request.getParameter()를 이용하는 불편함을 없앨수있음

예제를 위해서 com.crow.domain 패키지를 작성하고, SmapleDTO클래스도작성

SampleDTO 클래스 구성

SampleDTO 클래스는 lombok의 @Data 어노테이션을 이용해서 처리함.
@Data 어노테이션을 이용하면 getter/setter, equals(), toString() 등의 메서드를 자동 생성하기 때문에 편리함.

SampleController의 메서드가 SampleDTO를 파라미터로 사용하게 되면 자동으로 setter 메서드가 동작하면서 파라미터를 수집하게 됨
(이를 확인하고 싶다면 직접 set메서더를 제작하고 set 메서드 내 간단한 로그등을 출력해 보면 확인할 수 있음)

SampleController의 경로가 '/sample/*'이므로 ex01() 메서드를 호출하는 경로는 '/sample/ex01'이 됨
메서드에는 @GetMapping이 사용되었으므로, 필요한 파라미터를 URL뒤에 '?name=AAA&age=10'과 같은 형태로 추가해서 호출할 수 있음

실행된 결과를 보면 SampleDTO 객체 안에 name과 age 속성이 제대로 수집된 것을 볼 수 있음
특히 주목할 점은 자동으로 타입을 변환해서 처리함

파라미터의 수집과 변환

Controller가 파라미터를 수집하는 방식은 파라미터 타입에 따라 자동으로 변환하는 방식을 이용
예를 들면 SampleDTO에 int 타입으로 선언된 age가 자동으로 숫자로 변환 되는 것을 볼 수 있음

만일 기본 자료형이나 문자열 등을 이용한다면 파라미터의 타입만을 맞게 선언해주는 방식을 사용할수있음

SampleController에 ex02()메서드를 추가해줌

ex02() 메서드의 RequestParam

ex02() 메서드는 파라미터에 @RequestParam 어노테이션을 사용해서 작성함
@RequestParam은 파라미터로 사용된 변수이름과 전달되는 파라미터의 이름이 다른 경우에 유용하게 사용함
지금 예제의 경우 변수명과 파라미터의 이름이 동일하기때문에 사용할 필요는 없지만
@RequestParam 소개 차원에서 사용했음

브라우저에서 'http://localhost:8090/sample/ex02?name=AAA&age=10'호출시
ex01()과 동일한 데이터가 수집된것을 볼 수 있음.

리스트, 배열처리

동일한 이름의 파라미터가 여러 개 전달되는 경우에는 ArrayList<> 등을 이용해서 처리가 가능함
SampleController 클래스에 ex02List()메서드를 추가함
스프링은 파라미터 타입을 보고 객체를 생성하므로 파라미터 타입은 List<> 와 같이 인터페이스 타입이 아닌 실제적인 클래스 타입으로 지정함

위 코드의 경우 'ids'라는 이름의 파라미터가 여러개 전달되더라도 ArrayList이
생성되어 자동으로 수정됨
브라우저 등을 이용해서 'http://localhost:8090/sample/ex02List?ids=111&ids=222&ids=333'을
호출하면 ids : [111,222,333]같이 리스트 형식으로 출력됨

배열의 경우도 동일하게 처리 가능함 SampleController 클래스에 ex02array() 메소드 생성

⚠️ **GitHub.com Fallback** ⚠️