프레임워크/Spring19 [Spring] Autowired 필드주입은 왜 지양해야 하는가? FieldInject package com.example.demo.domain; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class FieldInject { @Autowired private Field1 field1; public Field1 getField1() { return field1; } } 인텔리제이에서 위와같이 필드주입을 하면 아래와 같은 글이 나오게 된다. Field injection is not recommended 왜 권장되지 않을까? 필드 주입은 순환참조를 막을 수 없다. a가 b를 가지고있고 b가 a를.. 프레임워크/Spring 2022. 3. 20. [Spring, Java] 멀티스레드 적용기 서비스를 만들며 가장 컸던 문제점은 중간지점을 찾기위한 탐색시간이 오래걸린다는 부분이다. 내부적으로 살펴보면 탐색지점을 찾기위해 추천할만한 역들의 리스트를 뽑고, 외부 API를 통해서 출발점과 도착역까지 걸리는 시간을 구하는 부분에서 시간이 오래걸리는 부분이었다. 모든 알고리즘을 적용하고 나니 걸렸던 시간은 대략 1분이었다. 정확한 지점을 찾기위한 로직이 추가되다 보니 시간이 많이 늘어나게 된것이다. 그렇지만 1분이라는 시간... 사용자 입장에서는 짧은시간이 아니다. 이러한 문제로 인해 여러가지 의견이 나오게 되었다. 정확하지 않아도 괜찮으니 로직을 빼서 시간을 단축하자. 우리 서비스의 아이덴티티인데 정확하지 않은것보다 낫지않냐? 그래서 둘의 타협점을 찾기위해 하루 정도의 시간을 두고 최적화를 해보고 그.. 프레임워크/Spring 2021. 8. 25. [Spring] @Qualifier란 무엇인가? Spring을 이용하여 서비스를 만들다보면 필연적으로 Bean을 만들어 등록하는 일이 생기게 된다. 스프링의 강력한 기능중 하나인 Autowired를 이용하여 의존성을 주입받는데, Bean에 하나의 타입만 있다면 해당객체를 주입받지만 만약 같은 타입이면 문제가 발생한다. Qualifier를 왜 사용해야 할까?? 내 상황의 경우 WebClinet를 Bean으로 등록했는데 요청해야 할 url이 많아서 여러개의 WebClient를 등록하면서 문제가 발생하였다.(카카오, 네이버, 공공API 등) 물론 그때그때 생성해서 쓰면되지만 자주 사용하고 재사용이 가능하다면 방법을 찾아야 하지 않을까? 이러한 문제를 해결하기 위해서 @Quailifer를 이용하게 된다. 특정한 객체를 찾기위한 이름을 지정한다고 생각하면 된다.. 프레임워크/Spring 2021. 8. 24. [Spring] RestDocs와 Swagger 프론트와 같이 협업을 하면서 API문서를 제공해야 하는 상황이 왔다. 처음에는 Notion에 하나하나 작성하였으나 API가 수정되었을때 변경하지 않아 불일치 되는 경우가 생기게 되었다. 이러한 문제를 해결하기 위해 문서 자동화를 도입하게 되었다. Spring에서 유명한 Swagger와 RestDocs중 어떤것을 도입할지 고민하기 위해 찾아보았다. Spring Rest Docs Swagger 장점 제품코드에 영향 없다. API 를 테스트 해 볼수 있는 화면을 제공한다. 테스트가 성공해야 문서작성된다. 적용하기 쉽다. 단점 적용하기 어렵다. 제품코드에 어노테이션 추가해야한다. 제품코드와 동기화가 안될수 있다. Swagger는 적용하기 쉽지만 컨트롤러에 어노테이션을 추가해야 하며 실제로 동작을 하지 않을 수도.. 프레임워크/Spring 2021. 8. 24. [Spring] RestTemplate와 webClient 프로젝트를 진행하면서 외부 API를 요청해야 하는 일이 생겼다. 그래서 외부 API를 요청하는 방법을 찾게되었고 외부에 API를 요청하는 방법이 여러가지가 있었다. Java에서 지원하는 HttpURLConnection Spring에서 지원하는 RestTemplate Spring에서 지원하는 WebClient Java에서 지원하는 기능은 자원을 우리가 다 관리해야 하며 복잡하기 때문에 Spring에서 지원하는 기능을 사용하기로 했다. RestTemplate Spring 3.0부터 나왔다. 블록킹 동기로 동작한다. 그렇지만 스프링 5.0으로 들어오고나서 WebClient가 나오고 유지보수만 진행되고 있다. As of 5.0 the RestTemplate is in maintenance mode, with o.. 프레임워크/Spring 2021. 8. 23. [Spring] @ComponentScan이란 무엇인가? 우리는 프로그램을 만들면서 필요에 따라 빈을 등록한다. @Component, @Service, @Repository, @Controller, @Configuration 등등이 있다. 그렇다면 우리가 등록한 것들을 어떻게 찾아서 빈으로 등록을 해줄까? 우리가 등록하고 싶다고 설정한 빈들을 찾아서 빈으로 만들어 주는 친구가 바로 @ComponentScan 이다. @ComponentScan은 해당 애너테이션이 작성된 패키지 이하의 클래스들을 순회하며 빈으로 등록될 객체들을 탐색한다. 아래와 같이 기준이 될 패키지를 지정할 수도 있다. @Configuration @ComponentScan(basePackages = "org.example") public class AppConfig { // ... } Sprin.. 프레임워크/Spring 2021. 6. 24. [Spring] @SpringBootApplication이란 무엇인가? SpringBoot를 이용하여 프로그램을 돌리기 위해 우리는 main함수에 @SpringBootApplication을 붙여 사용한다. 그 이유는 프로그램을 돌리기 위해 필요한 객체들을 만들어야 하는데(빈으로 등록하고) 그러한 애너테이션을 묶어둔 것이 @SpringBootApplication이기 때문이다. @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFil.. 프레임워크/Spring 2021. 6. 23. [Spring] SimpleJdbcInsert란 무엇인가? SimpleJdbcInsert는 간단하게 데이터를 저장하기 위해 만들어진 구현체이다. 기존의 의존성 주입으로 JdbcTemplate을 받는거와는 조금 다르게 설정을 해줘야 하는 부분이 있다. @Repository public class SimpleInsertDao { private final SimpleJdbcInsert insertActor; public SimpleInsertDao(DataSource dataSource) { this.insertActor = new SimpleJdbcInsert(dataSource) .withTableName("customers"); } } JdbcTemplate을 구성하기 위해 더 작은 단위인 DataSource를 가져와서 주입을 해주며 테이블 명을 설정해준다. 여.. 프레임워크/Spring 2021. 6. 22. [Spring] NamedParameterJdbcTemplate 이란 무엇인가? 기존에 사용하던 JdbcTemplate 같은 경우는 우리가 데이터를 넣을 부분에 ?를 이용하여 처리를 했다. 이러한 방식은 인자 위치에 대한 순서가 강제되는데 이러한 방식은 가독성을 떨어트린다. 그래서 나온것이 NamedParameterJdbcTemplate이다. NamedParameterJdbcTemplate는 ?대신 :변수명 을 이용하여 처리함으로써 순서에 강제를 받지 않는다. public int countOfActorsByFirstName(String firstName) { String sql = "select count(*) from T_ACTOR where first_name = :first_name"; SqlParameterSource namedParameters = new MapSqlPara.. 프레임워크/Spring 2021. 6. 22. [Spring] JdbcTemplate이란 무엇인가? 나는 이전까지 JDBC를 이용하여 프로젝트를 진행했었다.(아는게 이거밖에 없었다.) JDBC는 데이터베이스 종류에 영향을 받지 않고 정해진 API를 이용하여 처리하는 것이다. 이러한 JDBC는 추상화를 통해 영향을 덜 받게 만들었지만 불편함이 남아있었는데 그것은 아래와 같다. Connection으로 연결하기 쿼리를 작성 후 PreparedStatement로 실행하기 resultSet을 이용하여 결과 처리하기 Connection 닫아주기 의 과정이 필요하다. 편리함을 겪기 전까지는 당연하다고 생각이 들었던 내용이지만 JDBC Template을 써보니 중복되는 부분이 많이 제거되어 편리함을 느꼈다. JdbcTemplate은 JDBC와 마찬가지로 데이터를 저장하기 위해 도와주는 API이다. 다른점이라면 SQL.. 프레임워크/Spring 2021. 4. 28. [Spring] @ExceptionHandler와 @ControllerAdvice란 무엇인가? 우리는 기존에 에러를 핸들링 하기 위해서 try-catch를 사용했다. Spring에서는 이러한 것을 편하게 해결하기 위해 지원가능 기능이 있는데 이것이 바로 @ExceptionHandler이다. @Controller public class SimpleController { // ... @ExceptionHandler(CustomException.class) public ResponseEntity handle(IOException ex) { // ... } } 해당 컨트롤러에서 비즈니스 로직을 수행하다가 CustomException이 발생하면 해당 애너테이션이 붙어있는 메서드가 실행되어 에러를 처리하게 된다. 여기서 추가적으로 Controller에서 작성하는 것이 아니라 분리를 해서 처리를 할 수 있는데.. 프레임워크/Spring 2021. 4. 27. [Spring] @ResponseBody와 ResponseEntity의 차이는 무엇일까? 우리는 요청받는 내용에 응답하기 위해 응답결과를 Body에 넣어서 보내게 된다. Spring에서 Body에 데이터를 넣어 보낼때 이를 명시해줘야 하는데 사용방법은 아래와 같다. @Controller public class AccountController { @GetMapping("/accounts/{id}") @ResponseBody public Account handle(@PathVariable long id) { // ... } } 그렇지만 앞에서 작성한 RestController와 Controller의 차이에서 설명했듯이 이러한 내용은 RestController를 이용하면 붙이지 않아도 된다. @RestController public class AccountController { @GetMappin.. 프레임워크/Spring 2021. 4. 25. 이전 1 2 다음 💲 광고입니다.