Languages & Frameworks/Spring
[Spring] MVC : Controller와 Service의 책임 나누기
2020.07.06 : Languages & Frameworks/Springmartinfowler.com/bliki/PresentationDomainDataLayering.html 우선, 가장 크고 중요한 개념은 layer다. 일반적으로 많이 사용하는 layer 구분 Presentation layer Service layer Business layer Persistence layer *** 기타 sublayer 들을 포함할 수도 있음. layer를 왜 분리할까? layer를 분리한다는 것에는 어떤 의미가 있는가? layer를 나눈다는 것은, 무언가를 추상화 하는 것이 그 목적이다. 추상화를 잘 했다면, 각기 다른 계층끼리 부품을 갈아끼우듯 변경할 수 있다. 각 layer가 자신의 세부사항을 몰라도 상관 없도록, 잘 추상화해서 제공하고 있었다면 가능하다. 컴포넌트들의 서로의 의존..
[Spring] MVC : Model 클래스와 요청/응답 Data 클래스, 그리고 Map
2020.06.25 : Languages & Frameworks/Spring* Model은 보통 Business layer에서 사용하는 Domain Model을 의미한다. * 기타 layer에서 사용하는 Data Class는 Data Class라고 불렀다. Controller에서 Parameter : Map으로 받는 것과 별도의 Data Class를 만들어 받는 것? 별도 Data Class를 만들어 받으면 애너테이션 사용 가능 `` @Valid`` 가능! 좀 더 type safety 하다 클라이언트로부터 어떤 필드를 받는지 한 눈에 파악 가능 사실 이 것 때문에 웬만하면 만드는 것이 좋음. searchParam을 Map으로 받는 경우를 예로 들면, select문 까지 따라가야 어떤 파라미터가 Map으로 넘어오는지 확인이 된다. 유지보수하기 나쁨. Conrtoller에서 Res..
Java Servlet 이란
2020.06.15 : Languages & Frameworks/SpringServlet이 무엇인가? A servlet is a Java programming language class used to extend the capabilities of servers that host applications accessed by means of a request-response programming model. Although servlets can respond to any type of request, they are commonly used to extend the applications hosted by web servers. For such applications, Java Servlet technology defines HTTP-specific servlet classes..
RestTemplate은 어떻게 response Object를 DataType <T>로 변환하는가
2020.03.27 : Languages & Frameworks/Spring원래 그 데이터 타입으로는 캐스팅 가능 ```kt @Test fun `테스트`() { val obj: Object = Coffee("id", "name") as Object val coffee: Coffee = obj as Coffee // 이건 원래 그 데이터가 Coffee라서 가능 val obj2: Object = Object() val coffee2: Coffee = obj2 as Coffee // 이건 불가능. id 속성이랑 name 속성이 없으니까 당연 불가능하다 } ``` RestTemplate의 response Object -> T type casting 과정 RestTemplate도 내부적으로는 `` (T)`` 캐스팅을 이용하게 되는데 ``kt extractData()``에서 비검사 형변환..
[Spring] DB 관련 : Mybatis
2020.03.04 : Languages & Frameworks/SpringMybatis가 쿼리를 처리하는 방식? 스프링에서는 DB 커넥션을 어떻게 처리하는가? 쿼리 하나 날릴 때 마다 Connection을 맺고 끊는건 비효율적이므로, Connection Pool을 구성하여 Connection을 생성해두고, DB를 사용해야 할 때 Pool에서 커넥션을 빌려 쓰고 반납하게 되어 있다. Spring에서 제공하는 Connection Pool 인터페이스가 바로 `` DataSource`` 각 driver vendor들은 자사 규격에 맞게 `` DataSource`` 인터페이스를 구현해서 제공하고 있음!(커넥션 풀 구현체) ojdbc의 `` OracleDataSource`` jdbc의 `` ~~DataSource`` 각 벤더가 만들어 제공하는게 맞는게, Connection object를..
[Spring] profile로 beta, real 빌드 구분하기
2020.03.03 : Languages & Frameworks/Spring[Spring] 외부 상수 넣어주기 Spring profile VS Gradle(Maven) profile Spring profile? :: @Profile() Spring profile은 빌드 결과물 내에서 스프링이 어떤 profile을 사용할지 선택하는 것 런타임 프로파일 설정 Gradle(Maven) profile? :: .properties, .yml 빌드 시 어떤 profile을 리소스에 포함 시킬지 선택하는 것 빌드타임 프로파일 설정 Maven profile ----- 즉, Gradle profile이 더 큰 파일 개념이고, 선택한 파일 이외는 jar에 포함하지 않을 수 있음. Spring profile의 장점은 아예 빈 자체를 특정 프로파일에만 활성화 하는 등 좀 더 유연하게 사용할 수 있다..
[Spring] Controller에서 사용하는 애너테이션
2019.09.25 : Languages & Frameworks/Spring@RequestParam queryString이나 form 요청에서 파라미터를 하나 하나 받을 때 사용한다. ```java @RequestParam("name") @RequestParam(value="name", defaultValue="unknown") // ?name이 없어도 4** 뜨지 않음 @RequestParam(value="name", required=false) ``` 파라미터 하나 하나 마다 애너테이션을 적어줘야 하니 여러개를 받을 때는 지저분해져서 부적합하다. 여러개를 한번에 받기 위해 아래 처럼 Map으로 받는 방식은 쓰지 않는 것이 좋다. 대신 커맨드 객체(+@ModelAttribute)를 사용하자. ```java // 아래 방식은 별로다. 커맨드 객체를 쓰자 @RequestParam..
Spring AOP / @annotation resolve
2019.07.30 : Languages & Frameworks/SpringAOP란? Aspect Oriented Programming. 즉 관점 지향 프로그래밍이다. 이게 무슨 뜻인지 체감하려면 실사례를 생각해보는게 가장 좋다. 전문 통신 하는 상황을 생각해 보자. 전문 객체는 전문 필드 형식에 맞게 바이너리로 serialization 되어야 한다. ```java class telegramA { String field1; byte[] serialize() { field1이 길이가 4인지 체크하고 serialize } } class telegramB { String field1; byte[] serialize() { field2가 길이가 8인지 체크하고 serialize} } ``` telegramA의 field1은 length가 4여야 하고, telegramB의 field1은..
Hystrix with Spring ( Circuit Breaker ) 를 사용할 때 주의해야 할 점.
2019.07.30 : Languages & Frameworks/Spring기본 Hystrix 라이브러리는 직접 HystrixCommand를 상속받아 정의해서 써야 하므로 약간 번거롭다.Spring을 쓰고 있다면 @HystrixCommand 애너테이션으로 이런 번거로운 설정을 대신하는 라이브러리를 도입할 수 있다.아래 dependency를 추가하도록 하자. ```xml org.springframework.cloud spring-cloud-starter-netflix-hystrix 2.1.2.RELEASE````` spring-cloud-starter-hystrix``는 deprecated 되었기 때문에 `` spring-cloud-starter-netflix-hystrix``를 사용해야 한다는 점과, SpringBoot 2.x 대를 사용하고 있다면 hystrix 버전도 2.x...
[SpringBoot] context.getBean() 사용하기
2019.07.29 : Languages & Frameworks/SpringService 구현체가 많은 경우, 각각을 다 DI 하면 확장성이 떨어져 이를 Map에 담고 Interface로 꺼내 호출하는 방식을 자주 사용하게 된다. 다음과 같은 방법을 사용하면 Service Bean을 직접 불러올 수 있어 굳이 Map에 담지 않아도 사용 가능하다. 새로운 Service가 추가될 때 컨트롤러 쪽을 전혀 수정하지 않아도 되는 방식. (Map에 담는 방식은 생성자에서 map.put 해서 담아주어야 하니까...) ```java private final ApplicationContext context; // + DI ``` ```java PointChangeService pointChangeService = context.getBean(partnerCode + "PointChangeSer..
[Spring] DB 관련 : H2 설정
2019.07.23 : Languages & Frameworks/Springbuild.gradle에 다음을 추가. ``` runtimeOnly 'com.h2database:h2' // runtimeOnly 'com.h2database:h2:1.4.193' ``` 반드시 버전을 명시해줄 것. 버전 명시하지 않을 시 최신 버전이 설치되는데, 콘솔에서 connect해보면 자동으로 db 파일을 생성할 수 없어서 에러가 발생한다. :mem:을 써서 인메모리에 하든, :file:을 써서 파일로 저장하든 관계없이 에러가 발생함. 이는 어떤 취약점 때문에 자동으로 파일 생성하는걸 막아둬서 그렇다고 함. IFEXISTS 플래그를 주면 된다고 나와있는데 줘도 안됨. Database "mem:testdb" not found, and IFEXISTS=true, so we cant auto-creat..
RestTemplate 사용 시 ResponseType으로 generic 타입 받기 (ParameterizedTypeReference)
2019.07.11 : Languages & Frameworks/SpringResponse를 받을 때 Generic 타입으로 매핑하여 받고 싶을 때가 있다.```javaDefaultResponseWrapper userInfoResponseWrapper = restTemplate.postForObject( userInfoUrl, new UserInfoRequest("MTA1", "HH_SERVICE", encryptedCi), DefaultResponseWrapper.class);```그러나 `` postForObject()`` 같은 함수는 generic이 들어간 타입을 응답으로 받을 수 없다. 위처럼 작성하면 오류가 발생한다. ParameterizedTypeReference를 사용하면 generic 타입을 응답으로 받을 수 있다. (generic 타입으로 매핑할 수 있다.)``..