전체 글 120

HttpUrlConnection을 사용하여 외부URL Data Scrapping 하기

restfulAPI를 개발하다 보면 제공할 정보를 위해 만드는 경우도 많지만 반대로 필요한 OpenAPI 에 접근하여 원하는 데이터를 긁어와야 할 때도 많다. 실무에서 꽤 자주 썼는데 따로 정리한적은 없는 것 같아서 내가 실제로 자주 썼던 샘플코드를 하나 가져와봤다. 개발 환경 IDE : intelliJ FrameWork : springboot 3.2.2 / JPA(Hibernate5) Launguage : java 17 BuildTool : Gradle TestTool : Junit5 구현 내용은 다음과 같다 ResponseScrap @Getter @AllArgsConstructor(access = AccessLevel.PROTECTED) @NoArgsConstructor(access = AccessL..

Dev/Springboot 2024.03.14

ElaticSearch 란 무엇일까? 동작 방식을 이해해보자

본 글은 인프런의 ElasticSearch 강의를 듣고 정리한 내용이다. 출처가 궁금하신 분들은 아래 링크를 참조하면 좋겠다. https://www.inflearn.com/course/elasticsearch-essential/dashboard ElasticSearch Essential 강의 - 인프런 ElasticSearch 클러스터를 운영하기 위해 꼭 알아야 할 내부 동작에 대한 이해, 모니터링하는 방법, 사례를 기반으로 한 트러블 슈팅 방법을 알려주는 강의입니다. 이 강의를 통해 ElasticSearch 클러스 www.inflearn.com ES 적용 전에 ES 가 무엇인지, 어떻게 동작하는지에 대해 정리하는 게 필요하다고 생각해서 듣게 된 강의인데 아무래도 ES를 이미 적용해서 사용하고 있는 분들..

Dev/ELK 2024.03.14

MacOS 에서 ElasticSearch 설치하기 ( homebrew 사용 X )

Open API 통해서 데이터를 긁어온 뒤 검색 엔진에 ElasticSearch를 연동하는 토이 프로젝트를 해보고 싶어서 사용 방법을 익히기 위해 설치를 진행했다. 새로운 내용을 학습할 때 인프런을 통해 많이 찾아보는 편인데 딱히 강의랄게 없어서 공식 홈페이지를 참고하거나 구글링과 유튜브의 힘을 빌려서 진행했다. ( 처음 하는건데 따라 할만한 명확한 참고 문서를 못 찾아서 하다가 조금 늙었다 ) 개발환경 OS : Mac OS 13.4 / Mac m2 JDK : 17 ES ( ElasticSearch) 다운로드 및 실행 ES는 기본적으로 JVM 위에서 돌아가기 때문에, jdk는 설치되어 있어야 한다. 본 글에서는 jdk는 이미 설치되었다는 가정하에 글을 작성한다. jdk를 설치했다면 두 번째로 해야 할 것..

Dev/ELK 2024.03.13

익명 클래스(annoymous class)

익명 클래스란 무엇인가? 익명 클래스는 이름이 없는 클래스를 의미한다. 클래스의 선언과 객체의 생성을 동시에 하기 때문에 단 한 번만 사용될 수 있고 오직 하나의 객체만을 생성할 수 있는 일회용 클래스이다. 익명 클래스는 다음과 같은 특징을 가진다. 생성자를 가질 수 없다 하나의 클래스로 상속받는 동시에 인터페이스를 구현하거나 둘 이상의 인터페이스를 구현할 수 없다. 즉 오로지 하나의 클래스를 상속받거나 단 하나의 인터페이스만을 구현할 수 있다. 예시 코드로 나타내면 다음과 같다. // 익명 클래스를 사용하지 않은 경우 class Innerclass { public static void main(String[] args) { Classb b = new ClassB("make"); b.addActionLi..

Dev/Java 2024.03.12

다형성(Polymorphism)과 참조변수 ( with. instanceof 연산자의 필요성)

다형성과 참조변수 객체지향개념에서 다형성이란 '여러 가지 형태를 가질 수 있는 능력'을 의미하며 자바에서 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현할 수 있다. 즉 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하는 것이다. Class Tv { boolean power; int channel; void power(); void channelUp(); void channelDonw(); } class CaptionTv extends Tv { String next; void caption() ... } Tv 클래스와 CaptionTv 클래스가 다음과 같이 정의 되어 있을 때 두 클래스를 생성하고 사용하는 방법은 일반적으로 다음과 같..

Dev/Java 2024.03.12

람다식 ( Lamda expression ) / @FunctionalInterface

본 글에서는 기본적인 람다사용 법과 람다를 사용하는 이유에 대해 작성하고자 한다. 예제소스링크 람다식이란? jdk 1.8부터 추가된 람다식은 자바를 객체지향언어인 동시에 함수형 언어로 만들었다. 람다식이란 메서드를 하나의 식(expression)으로 표현한 것이다. 메서드는 객체 지향에서 객체의 행위나 동작을 의미하는 용어인데, 클래스에 반드시 속해야 한다는 제약이 있다. 모든 메서드는 클래스에 포함되어야 하므로 클래스도 새로 만들어야하고, 객체도 새로 만들어야 하지만 람다식은 오직 람다식 자체만으로도 이 메서드의 역할을 대신할 수 있게 해준다. 메서드를 람다식으로 변환하면 메서드의 이름과 반환 값이 사라지게 된다. 다음 예제를 보면 쉽게 이해할 수 있다. 일반적인 메서드 int max(int a, in..

Dev/Java 2024.03.11

[SQLD] select 실행 순서 / on 과 where 의 차이 / 집계함수 ( count ) / 그룹 함수와 계층 쿼리 ( rollup, cube, grouping sets, connect by )

SQLD를 공부하면서 실무에서 도움 될만한 내용에 대해 간단히 정리해보려고 한다. select 문 실행 순서 select 문 실행순서는 from -> where -> group by -> having -> select -> order by 순으로 실행 된다. on과 where의 차이 where 은 결과 출력에 대해 관여하지만 on 은 join 하는 대상 데이터에 대해 관여한다. 예를 들어 on id = 1000 가 조인 조건에 있을 경우 id = 1000 인 데이터들만 join에 관여하지만, 그렇지 않은 데이터들도 null 값으로 출력된다. ( 단, outer join 경우에 해당한다. inner join 일 경우 교집합에 대해서만 출력되기 때문이다. ) 만약 where 에 id = 1000 이 있다면..

자격증/SQLD 2024.03.11

2024년 SQLD SQL 자격검정 실전문제(노랭이) 후기 / 2024 1회차 SQLD 후기

시험 후기는 합격하고 쓰는 게 맞다고 생각해서 나중에 쓰려고 했는데 자격증 공부하면서 실무에서 꽤 자주 쓰던 쿼리에 대해 정리하면 좋을 것 같기도 하고 2024년부터 시험 범위가 개정되면서 소위 노랭이로 말하는 기출문제가 개정판으로 신규 출간되었는데 이에 대한 대한 정보가 많이 없어서 정보 공유차 글을 남긴다. 노랭이 2024 개정판 후기 2024년부터 SQLD의 범위가 변경 됐다. ( 변경된 범위가 궁금하다면 링크 참조 ) SQLD 최적화 기본 원리가 빠지면서 범위가 대폭 줄어들어서 쿼리 난이도가 올라간다는 얘기가 많았는데 실제 시험장에서 체감한 난이도는 노랭이보다는 쉬웠다. 개정전에 시험을 본 적이 없어서 자세한 비교는 힘들겠지만, 노랭이에서 나왔던 내용이 그대로 나오는 경우도 꽤 있었고 문제에서 묻..

자격증/SQLD 2024.03.10

WebApplication 의 Exception 처리

예제 파일 링크 바로가기https://github.com/gahyeonkwon/dev_study/tree/main/exceptiondemo/src/main  Exception과 logging 은 개발할 때마다 가장 고심하는 부분이다.  spring 프레임워크에서 제공하는 Exception 처리는 사용하기 편리하지만 실제로 웹 애플리케이션이 어떻게 Exception을 전달하는지에 대해 정리 필요성을 느껴 글을 작성하게 되었다. Exception 이 전달 되는 순서Exception 이 발생하면 Controller -> Interceptor -> Servlet -> Filter -> Was 순으로 전달이 된다. 일반적으로 Exception 은 Try - Catch 구문을 통해 Servlet 내에서 처리되지만,..

Dev/Springboot 2024.03.10

개인프로젝트_Ukmedicine_4 ( 종료 )

이전 포스팅은 여기로 2024.02.25 - [개발/project] - 개인프로젝트_Ukmedicine_3 개발환경 Os : MacOs 13.4 IDE : intelliJ IDEA Edu FrameWork : springboot 3.2.2 / jpa / thymeleaf Launguage java 17 DB : MariaDB 11.2.2 DB tool : DBeaver 23.3.0 FrontEnd Design : Bootstrap 5.3.2 Github : https://github.com/gahyeonkwon/uk_medicine.git 작업 목표 연관관계가 있는 엔티티 RecipeSpec로 데이터 삽입하기 @Setter, @AllConstructorm @NoArgsConstructor에 대한 고찰 ..

Dev/Toy Project 2024.03.09

h2 모드에 따른 application.yml 설정방법

h2 는 가볍고 편리해서 개발초기에 사용을 자주하는 데이터베이스인데 파일모드와 메모리모드, tcp 접근모드를 지원한다. 모드별로 설정 방법이 다르기 때문에 application.yml 에 원하는 설정에 맞게 경로를 입력해줘야 한다. h2 파일모드 접근방법 jdbc:h2:~/querydsl h2 tcp 모드 접근방법 jdbc:h2:tcp://localhost/~/querydsl h2 mem 모드 접근방법 jdbc:h2:mem:querydsl 예시 datasource: url: jdbc:mariadb://localhost:3306/uk_medicine

Dev/Etc 2024.02.28

#ids.seq 사용하기 ( feat. prev 와 next )

th:each 사용시 내부에서 ids.seq 를 사용하면 index(ID count) 처리를 할 수 있다. 이 때 index 는 1 부터 시작한다. prev  each 문에 의해 loop 를 돌 때마다 index 값은 1개씩 증가하는데, prev 는 바로 이전에 해당하는 index 값이 반환 됨을 알 수 있다. 이 때 주의 해야할 점은 객체를 사용하지 않으면 index 는 생성되지 않는다. 따라서 객체를 사용하지 않았는데 prev 를 쓴다면 다음과 같은 예외가 발생한다. org.attoparser.ParseException: Cannot obtain previous ID count for ID 간단한 예제를 들어보자. 위 코드에서 materialsId 라는 객체가 input 에서 먼저 사용되었기 때문에..

Dev/Thymleaf 2024.02.26

RedirectAttributes 사용시 java.lang.IllegalArgumentException: Model has no value for key 오류 해결하기

페이지가 redirect 될 때 값을 함께 전달하고 싶어서 RedirectAttributes 를 사용해서 구현했는데 java.lang.IllegalArgumentException: Model has no value for key 오류가 발생했다. redirectAttributes.addFlashAttribute("getWaterMount", waterMount); "redirect:/recipe/spec/{recipeId}" 이게 문제가 되던 코드인데 redirectAttributes.addFlashAttribute("getWaterMount", waterMount); "redirect:/recipe/spec/" + waterMount.getRecipeId(); 로 변경해서 오류를 해결 했다.

Dev/Springboot 2024.02.25