java36 Java Collection FrameWork(JCF)란? 왜 나오게 되었을까? 예전에는 자료구조를 이용할 때 같은 역할이나 목적이 같지만 구현체의 메서드명이 달라 여러움을 느꼈다. (Vector, Array, HashTable) 즉, 확장이 쉽지 않았으며, 표준 인터페이스를 구현하지 않다. 이러한 부분을 해결하기 위해 JCF가 나오게 되었다. JDK 1.2 버전부터 나왔다. 그래서 JCF가 먼데? 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합이다. 간단히 생각하면 자료구조 모음이라고 생각해도 될 것 같다. JCF의 계층 구조 크게 Iterable을 상속한 인터페이스와 Map을 상속한 인터페이스로 나눌 수 있다. Iterable에 포함된 인터페이스는 List, Queue, Set이다. List ArrayList : 크기가.. 프로그래밍언어/Java 2021. 10. 25. 자바(Java) 왜 for-each문을 추천할까? 인텔리제이에서 for문으로 작성하다보면 List와 같은 경우는 인덱스를 따로 쓰지 않는이상 for-each문으로 바꾸라고 경고를 한다. private static void test(List numbers) { for (int i = 0; i < numbers.size(); i++) { System.out.println(numbers.get(i)); } } 'for' loop replaceable with enhanced 'for' 왜 그럴까? 그것은 자료구조의 변경을 유연하게 하기위해 인터페이스로 객체를 사용하고 있기 때문이다. 인자로 들어오는 List가 ArrayList인지 LinkedList인지 Vector인지 Stack인지 알 수 없다. 여기서 발생하는 문제점은 바로 List에서 사용하는 get().. 프로그래밍언어/Java 2021. 8. 25. [Spring, Java] 멀티스레드 적용기 서비스를 만들며 가장 컸던 문제점은 중간지점을 찾기위한 탐색시간이 오래걸린다는 부분이다. 내부적으로 살펴보면 탐색지점을 찾기위해 추천할만한 역들의 리스트를 뽑고, 외부 API를 통해서 출발점과 도착역까지 걸리는 시간을 구하는 부분에서 시간이 오래걸리는 부분이었다. 모든 알고리즘을 적용하고 나니 걸렸던 시간은 대략 1분이었다. 정확한 지점을 찾기위한 로직이 추가되다 보니 시간이 많이 늘어나게 된것이다. 그렇지만 1분이라는 시간... 사용자 입장에서는 짧은시간이 아니다. 이러한 문제로 인해 여러가지 의견이 나오게 되었다. 정확하지 않아도 괜찮으니 로직을 빼서 시간을 단축하자. 우리 서비스의 아이덴티티인데 정확하지 않은것보다 낫지않냐? 그래서 둘의 타협점을 찾기위해 하루 정도의 시간을 두고 최적화를 해보고 그.. 프레임워크/Spring 2021. 8. 25. [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] @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. [Spring] @RequestBody란 무엇인가? 사용법은? 이전에 Header와 Parameter를 이용하여 데이터를 가져오는 내용을 정리했다. 위와 같은 방식은 GET이나 DELETE와 같이 Body가 없을때 사용하는 방식이다.(혹은 인증이나) 그렇지만 위와 같은 방식은 보안이 취약해지거나 데이터가 많아지면 문제가 발생한다. 그래서 생성과 수정의 역할을 담당하는 POST와 PUT에는 Body를 붙여 사용할 수 있다. Body에 있는 데이터를 가져오는 방법은 아래와 같다. @PostMapping("/users/body") public ResponseEntity requestBody(@RequestBody Map body) { User newUser = new User(1L, body.get("name"), body.get("email")); return Resp.. 프레임워크/Spring 2021. 4. 24. [Spring] Header에서 데이터 가져오기 @RequestHeader 우리가 클라이언트에게 데이터를 받는 방법이 여러개가 있는데 이번에는 Header를 이용하여 데이터를 가져오는 방법을 정리했다. @GetMapping(path = "/message", headers = "HEADER") public ResponseEntity messageForHeader(@RequestHeader HttpHeaders header) { return ResponseEntity.ok().body(header.getFirst("HEADER")); } Parameters에서의 params와 비슷하게 여기서는 headers를 추가하여 필요한 내용을 강제할 수 있다. 받을때 사용하는 애너테이션 또한 @RequestHeader를 이용하여 header를 받아 데이터를 꺼내서 사용한다. 다른 방식으로 아.. 프레임워크/Spring 2021. 4. 23. [Spring] Parameter에서 데이터 가져오기 @RequestParam 우리가 클라이언트에게 데이터를 받는 방법이 여러개가 있는데 이번에는 Parameter를 이용하여 데이터를 가져오는 방법을 정리했다. Parameter로 데이터를 보내는 방법은 URL 뒤에 ?name=mungto 이러한 방식이다. Spring에서 처리하는 방법은 사용방법은 아래와 같다. @GetMapping(path = "/message") public ResponseEntity messageForParam(@RequestParam("name") String name) { ... } 변수명과 parameter이름이 같다면 괄호안에 내용은 생략이 가능하다. @GetMapping(path = "/message") public ResponseEntity messageForParam(@RequestParam St.. 프레임워크/Spring 2021. 4. 22. 이전 1 2 3 다음 💲 광고입니다.