728x90 사이드 프로젝트 회고: "LagLess" 여행 중 시차 극복 서비스 안녕하세요. 여행 중 시차로 인한 불편함을 최소화하고 여행자들이 더 즐거운 여행을 경험할 수 있도록 돕는 서비스, "LagLess"입니다. 이 글을 통해 프로젝트의 배경, 주요 기능, 개발 중 만난 오류 등을 소개하고자 합니다. 프로젝트 배경 여행을 좋아하는 많은 사람들이 공통으로 겪는 문제 중 하나가 바로 '시차 적응'입니다. 시차로 인해 체력이 떨어지거나, 원하는 시간에 잠을 못 자는 등의 불편함을 겪습니다. 이런 문제를 해결하기 위해 "LagLess"를 개발하게 되었습니다. 주요 기능 취침 시간 최적화 추천: 여행 전날 취침, 비행기 내 낮잠, 그리고 도착 후 첫날의 취침 시간을 최적화하여 추천합니다. 이를 통해 사용자들은 여행 중 피로를 최소화하고 편안한 여행을 즐길 수 있습니다. 여행 일정 리마.. 2024. 2. 11. 크롬 브라우저에 URL을 입력하면? 요약 브라우저 URL 해석 URL 파싱 - HSTS, DNS, ARP HTTP 메시지를 통한 TCP socket 통신(Three-Way Handshake), ARP HTTP 프로토콜 요청, HTTP 서버 응답 웹 브라우저가 리소스 그림 - 브라우저 렌더링 TCP 연결 종료 (TCP Four-Way Handshake) 출처 : http://tcpschool.com/webbasic/works 크롬 브라우저에 url을 입력하면! 크롬에서 일어나는 일 Handling inputs : url 입력 Browswer process 안에 UI thread가 text를 search query or URL 판단 search query -> search engine으로 query를 보내 검색 준비 URL -> network.. 2023. 10. 17. [Java] 람다식 람다식 목차 람다식 사용법 함수형 인터페이스 Variable Capture 메소드, 생성자 레퍼런스 람다식이란? 식별자 없이 실행가능한 함수 간단히 말해 메서드를 하나의 식으로 표현한 것이다. 메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어지므로, '익명 함수(anonymous function)' 이라고도 한다. 익명 구현 객체는 인터페이스나 클래스의 객체를 생성해서 사용할 때, 재사용하지 않는 경우 보통 사용한다. 람다식의 도입으로 인해 자바는 객체지향언어인 동시에 함수형 언어가 되었다. 람다식 사용법 int[] arr = new int[5]; Arrays.setAll(arr, (i) -> i + 1); // [1, 2, 3, 4, 5] 위 코드에서(i) -> i + 1 구문이 람다식이다. .. 2023. 9. 25. [Java] 제네릭(Generic) 제네릭(Generic) 목차 제네릭 사용법 제네릭 주요 개념 (바운디드 타입, 와일드카드) 제네릭 메소드 만들기 Erasure 제네릭을 왜 사용할까 제네릭은 다양한 타입의 객체를 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크(compile-time type check)를 해주는 기능이다. 추가로, 자료형만 다른 중복되는 소스를 하나로 묶어 소스 코드의 재사용성 높이기 위해서이다. - 제네릭스는 JDK 1.5에서 처음 도입되었다. 장점 컴파일 시 타입 체크를 해줌으로써 타입 안정성이 높다. 형변환을 생략할 수 있어서 코드가 간결해진다. List list = new ArrayList(); list.add("안녕하세요"); //타입 캐스팅 String s = (String) list.get(0); L.. 2023. 8. 7. [Java] I/O I/O 목차 스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O InputStream과 OutputStream Byte와 Character 스트림 표준 스트림 (System.in, System.out, System.err) 파일 읽고 쓰기 I/O 입출력 입출력이란? 입출력(I/O)란 Input과 Output의 약자로 입력과 출력, 간단히 입출력이라 한다. 입출력은 컴퓨터 내부 또는 외부 장치와 프로그램 간의 데이터를 주고받는 것을 말한다. 자바 NIO(New I/O) 자바 1.4 버전부터 추가된 API로 넌블로킹 처리가 가능하며, 스트림이 아닌 채널을 사용한다. 채널기반의 입출력방식을 사용하며 단방향이 아닌 양방향으로 입출력이 가능하다. IO vs NIO IO의 방식.. 2023. 7. 22. [Java] 어노테이션(Annotation) 어노테이션(Annotation) 목차 어노테이션 정의하는 방법 @retention @target @documented 어노테이션 프로세서 어노테이션을 정의하는 방법 public @interface MyAnnotation { } 어노테이션도 enum과 마찬가지로 1.5에 등장했다. 생성된 어노테이션의 부모는 java/lang/annotation/Annotation이다. // 바이트 코드 public abstract @interface study/MyAnnotation implements java/lang/annotation/Annotation { // compiled from: MyAnnotation.java } 어노테이션은 리플렉션을 사용한다는 것을 알 수 있다. Annotation annotation .. 2023. 7. 4. [Java] 리플렉션(Reflection) 리플렉션(Reflection) 리플렉션은 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API를 말한다. 컴파일 시간이 아닌 실행 시간에 동적으로 특정 클래스의 정보를 추출할 수 있는 프로그래밍 기법이라 할 수 있다. 어떤 경우에 사용되나? 런타임에 지금 실행되고 있는 클래스를 가져와서 실행해야 하는 경우 동적으로 객체를 생성하고 메서드를 호출하는 방법 자바의 리플렉션은 클래스, 인터페이스, 메소드들을 찾을 수 있고, 객체를 생성하거나 변수를 변경하거나 메소드를 호출할 수 있다. 동적으로 클래스를 만들어서 의존 관계를 맺어줄 수 있다. Spring의 Bean Factory를 보면, @Controller, @Service, @Repository .. 2023. 6. 30. [SpringBoot] IntelliJ와 Gradle이 테스트 구성을 처리하는 방식의 차이에서 발생한 오류 문제 상황 기존 코드는 @SpringBootTest를 사용하였습니다. 테스트를 진행할 때 Intellij의 test를 실행하면 정상 작동되고 gradle clean test를 사용하면 빌드 오류가 났습니다. 즉, 테스트 & 개발할땐 전혀 문제가 없는데 빌드만 하면 저기가 실패합니다. @SpringBootTest를 사용하면 @Configuration, @Component 등과 같은 주석을 사용하여 빈과 해당 종속성을 정의하여 Spring이 이러한 개체의 인스턴스화, 연결 및 수명 주기 관리를 처리할 수 있도록 합니다. // 오류 코드 Could not detect default configuration classes for test class [com.ll.MOIZA.boundedContext.select.. 2023. 6. 28. [SpringBoot] @SpringBootTest와 @Import @SpringBootTest와 @Import Spring Boot에서 적절한 테스트 구성 접근 방식을 선택하는 것은 효과적이고 안정적인 테스트 환경을 만드는 데 중요합니다. 각 접근 방식의 목적, 용도, 특성 및 이점을 자세히 살펴보고 다른 접근 방식을 선택해야 하는 이유에 대해 알아보겠습니다. @SpringBootTest: 목적 및 역할: @SpringBootTest는 Spring Boot 테스트 프레임워크에서 제공하는 강력한 주석입니다. 통합 테스트를 위한 애플리케이션 컨텍스트를 생성하고 모든 구성, 구성 요소 및 빈과 함께 전체 컨텍스트를 로드합니다. 사용법: 테스트 클래스에 @SpringBootTest로 주석을 달아 런타임 환경을 유사하게 모방하고 포괄적인 통합 테스트를 수행합니다. 구성 요소 검.. 2023. 6. 28. [Java] 바이트코드 조작 바이트코드 조작 바이트 코드 조작은 개발자의 소스코드(.java)를 직접 수정하지 않고 .class 파일을 수정하여 원하는 기능 구현하는 장점이 있습니다. 바이트코드 조작 활용 예시 프로그램 분석 코드 복잡도 계산 성능 분석 최적화 로깅 클래스 파일 생성 프록시 특정 API 호출 접근 제한 스프링 컴포넌트 스캔(asm 라이브러리 사용) 애노테이션들을 찾는 과정 강력한 기능으로 활용 범위가 굉장히 많다 바이트코드 조작 라이브러리 ASM : https://asm.ow2.io/ Javassist : https://www.javassist.org/ ByteBuddy : https://bytebuddy.net/ API 문서가 잘되어 있고 사용하기 편하다. ByteBuddy 실습 아무것도 없는 Moja에서 Rabb.. 2023. 6. 23. [Java] 코드 커버리지 JVM은 바이트코드를 유연하게 생성할 수 있도록 제공해 준다. 즉 컴파일된 바이트코드를 조작하여 내가 원하는 동작을 하도록 만들 수 있다. 아래는 바이트코드 조작 라이브러리들이다. ASM Javassist ByteBuddy CGLib (Code Generator Library) JaCoCo 여기서 JaCoCo는 어떻게 만들어졌는지 알아보자. JaCoCo는 Java 코드의 커버리지를 체크하는 라이브러리이다. 테스트코드를 돌리고 그 커버리지 결과를 눈으로 보기 좋도록 html이나 xml, csv 같은 리포트로 생성해 준다. 커버리지 기준을 설정할 수 있다. JaCoCo는 바이트코드 조작 라이브러리를 사용해 Java 코드를 하나도 건드리지 않고 커버리지를 확인하고 동작할 수 있다. 코드 커버리지란 테스트 케이.. 2023. 6. 21. [백준] 7662 이중 우선순위 큐 자바(Java) 7662번: 이중 우선순위 큐 입력 데이터는 표준입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 Q에 적 www.acmicpc.net 풀이 TreeMap 자료 구조를 사용한다. TreeMap은 키값을 기준으로 즉시 정렬되는 자료 구조입니다. key = 정수, value = 입력된 횟수 최댓값(최솟값)의 입력 횟수가 2번 이상일 때는 입력 횟수 -1, 입력된 횟수가 1번이면 삭제한다. 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Str.. 2023. 6. 19. [Java] Enum Enum 목차 enum 이란? enum이 제공하는 메소드 (values()와 valueOf()) java.lang.Enum EnumSet Enum이란? enum(열거형)은 Enum을 '열거형' 또는 Enumeration 또는 상수집합 이라고도 부른다. 서로 관련된 상수를 편리하게 선언하기 위한 것으로 상수를 여러 개 정의할 때 사용한다. enum 장점 IDE의 적극적인 지원을 받을 수 있습니다. 허용 가능한 값들을 제한할 수 있습니다. 리팩토링 시 변경 범위가 최소화된다. 데이터들 간의 연관관계 표현 상태와 행위를 한 곳에서 관리 데이터 그룹 관리 Enum은 왜 생겼나. 상수를 정의하는 방법을 개선하다 보니 열거형이 적합하기 때문이다. 추가로, 열거형을 사용하면 코드의 가독성을 높이고 논리적인 오류를 줄.. 2023. 6. 14. [Java] 멀티쓰레드 프로그래밍 멀티쓰레드 프로그래밍 목차 Thread? Thread 클래스와 Runnable 인터페이스 Main 쓰레드 쓰레드의 상태 쓰레드의 우선순위 동기화 데드락 Thread? 쓰레드는 하나의 프로그램에서의 실행 흐름이다. JVM은 병렬적으로 작동하는 여러개의 쓰레드 실행을 허용한다. 모든 쓰레드는 우선순위가 있다. 우선순위가 높은 쓰레드는 우선순위가 낮은 쓰레드보다 먼저 실행된다. 어떤 쓰레드는 데몬쓰레드가 되거나 되지 않을수 있다. 일부 쓰레드에서 실행중인 코드가 새 쓰레드 객체를 생성할 때, 새 쓰레드는 처음에 생선된 쓰레드의 우선순위와 동일하게 설정된 우선순위를 가지며, 생성쓰레드가 데몬인 경우에만 데몬쓰레드가 된다. JVM이 시작될 때 일반적으로 메인메서드의 호출로 발생한 단일 비데몬 쓰레드가 있다. JV.. 2023. 6. 9. [Java] 예외처리 예외처리 목차 자바에서 예외 처리 방법 (try, catch, throw, throws, finally) 자바가 제공하는 예외 계층 구조 Exception과 Error의 차이는? RuntimeException과 RE가 아닌 것의 차이는? 커스텀한 예외 만드는 방법 자바에서 예외 처리 방법 (try, catch, finally, throw, throws) try { 예외를 처리하길 원하는 실행 코드; } catch (e1) { e1 예외가 발생할 경우에 실행될 코드; } catch (e2) { e2 예외가 발생할 경우에 실행될 코드; } ... finally { 예외 발생 여부와 상관없이 무조건 실행될 코드; } The try block try Block은 예외가 발생할 수 있는 코드를 넣는 곳입니다. 여.. 2023. 5. 19. [Java] 인터페이스(Interface) 인터페이스(Interface) 목차 인터페이스 정의하는 방법 인터페이스 구현하는 방법 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법 인터페이스 상속 인터페이스의 기본 메서드 (Default Method), 자바 8 인터페이스의 static 메서드, 자바 8 인터페이스의 private 메서드, 자바 9 인터페이스 추상 클래스보다 추상화가 높다. 일반 메서드 또는 멤버 변수를 가질 수 없고, 오직 추상 메서드와 상수만을 맴버로 가질 수 있다. Java 8버전 부터 default 예약어를 통해 일반 메소드구현이 가능하다. 인터페이스와 추상 클래스는 자기 자신을 객체화할 수 없으며 다른 객체가 상속(extends) , 구현(implements)을 하여 객체를 생성할 수 있다. 하위 클래스에서는 상위에서 정의.. 2023. 5. 16. [Java] 패키지(Package) 패키지(Package) 목차 package 키워드 import 키워드 접근제어자 클래스패스 CLASSPATH 환경변수 -classpath 옵션 package 패키지란 많은 클래스들을 체계적으로 관리하기 위해 존재한다. 패키지의 물리적인 형태는 "파일 시스템의 폴더" 이다. 폴더를 만들어서 파일을 저장하듯, 패키지를 만들어서 클래스를 저장/관리 한다. 또한, 파일 시스템의 폴더 기능만이 아니라 클래스의 일부분이다. 패키지는 클래스를 유일하게 만들어주는 "식별자" 역할을 한다. 클래스의 전체 이름은 "패키지 + 클래스명" 이다. 패키지가 상, 하위로 구분되어 있다면 도트(.)를 사용해서 표현한다. 상위패키지.하위패키지.클래스 패키지 이름과 위치한 폴더의 이름이 같아야한다. 모든 클래스에는 정의된 클래스 이름.. 2023. 5. 11. [Java] 상속(inheritance) 상속(inheritance) 목차 자바 상속의 특징 super 키워드 메소드 오버라이딩 다이나믹 메소드 디스패치 (Dynamic Method Dispatch) 추상 클래스 final 키워드 Object 클래스 자바 상속의 특징 "classes can be derived from other classes, thereby inheriting fields and methods from those classes." Single inheritance (No diamond inheritance) Object를 제외한 모든 클래스는 암묵적으로 Object의 서브클래스 다단계 상속이 가능하고, 다중 상속을 지원하지 않는다. super 키워드 부모 클래스의 생성자나 메소드를 호출한다. 부모 생성자를 호출하는 경우를 특별.. 2023. 5. 2. [Java] 클래스 Class 클래스(Class) 목차 클래스란 무엇인가? 클래스 정의하는 방법 객체 만드는 방법 (new 키워드 이해하기) 메소드 정의하는 방법 생성자 정의하는 방법 this 키워드 이해하기 클래스란 무엇인가? 클래스는 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메소드(method)로 구성됩니다. 즉, 객체의 설계도입니다. 클래스 정의하는 방법 public class Example{ private String name; private String contents; public Example(){} //기본 생성자 public Void setName(String name){ this.name = name; } public String getName(){ return this.name; } } 객.. 2023. 4. 28. [Java] JUnit5 기본 애노테이션 @Test, @BeforeAll / @AfterAll, @BeforeEach / @AfterEach class StudyTest { @Test void create() { Study study = new Study(); assertNotNull(study); System.out.println("create"); } @Test void create1() { System.out.println("create1"); } // BeforeAll, AfterAll 은 static으로 선언해야한다. @BeforeAll static void beforeAll() { System.out.println("beforeAll"); } @AfterAll static void afterAll() { System... 2023. 4. 26. [Java] 제어문 제어문 프로그램의 흐름을 제어할 수 있도록 도와주는 실행문 Decision-Making Statements: if, if-else, switch Looping Statements: for, while, do-while Branching Statements: break, continue, return Decision-Making Statements if statement if (condition) { /* code */ } condition이 true일 때 code블럭 실행 if-else statement if (condition) { /* code1 */ } else { /* code2 */ } condition이 true이면 code1 실행, 아니면 code2 실행 switch statement swi.. 2023. 4. 24. [Spring Boot] Spring Boot 3.x 실행 안될 경우 3.X부터는 Java 17부터 지원된다. 기존에 Java8, 11등을 사용하시던 분들은 3.x 스프링 부트 프로젝트를 실행할때 에러들을 만나게 된다. //error No matching variant of org.springframework.boot:spring-boot-gradle-plugin:3.0.1 was found. The consumer was configured to find a runtime of a library compatible with Java 16, packaged as a jar, and its dependencies declared externally, as well as attribute 'org.gradle.plugin.api-version' with value '7.6' .. 2023. 4. 24. [Java] 연산자 목표 자바가 제공하는 다양한 연산자를 학습하세요. 학습할 것 산술 연산자 비트 연산자 관계 연산자 논리 연산자 instanceof assignment(=) operator 화살표(->) 연산자 3항 연산자 연산자 우선순위 Java 13. switch 연산자 학습 내용 정리 연산자 연산자: 연산에 사용되는 기호 피연산자: 연산에 대한 대상 ex // 연산자: +, 피연산자: 1, 2 1 + 2; int a = 2; int b = 3; // 연산자: *, 피연산자: a, b a * b; 산술 연산자 Binary Operator(이항 연산자) +, -, *, /, %(Modulo) Arithmetic Exception(산술 예외) 발생 가능 INF "무한"또는 INF 값은 너무 큰 숫자를 나타냅니다. +INF.. 2023. 4. 19. [Java] Primitive Type Array to Stream Primitive Type Array to Stream import java.util.Arrays; import java.util.stream.DoubleStream; import java.util.stream.IntStream; import java.util.stream.LongStream; import java.util.stream.Stream; public class Main { public static void main(String[] args) { // Example with int[] int[] arr = {1, 2, 3, 4, 5}; // Convert int[] to IntStream IntStream intStream = Arrays.stream(arr); // Example with d.. 2023. 4. 19. [Java] String / StringBuffer / StringBuilder 차이점 & 성능 비교 String String은 immutable(불변) 하다. String Constant Pool에 있는 값은 변하는 것이 아니라 새로운 값의 주소를 가리키게 된다. String 객체의 내부 구성 요소를 보면 다음과 같이 되어 있다. public final class String implements java.io.Serializable, Comparable { private final byte[] value; } 인스턴스 생성 시 생성자의 매개변수로 입력받는 문자열은 이 value라는 인스턴스 변수에 문자형 배열로 저장되게 된다. 이 value라는 변수는 상수(final) 형이니 값을 바꾸지 못하는 것이다. replace(), toUpperCase(), subString(), concat() 등 Strin.. 2023. 4. 18. [백준] 6198 옥상 정원 꾸미기 자바(Java) 풀이 기존에 지나온 빌딩 중 새로운 빌당보다 낮은 빌딩만 저장 마지막 서있는 곳보다 새로운 빌딩의 높이가 낮으면 같이 지나갈 수 있기 때문 스택에 가장 마지막 빌딩 높이(마지막 서있는 곳) 2023. 4. 13. [Java] 데이터 타입, 변수 그리고 배열 목표 자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다. 학습할 것 프리미티브 타입 종류와 값의 범위 그리고 기본 값 프리미티브 타입과 레퍼런스 타입 리터럴 변수 선언 및 초기화하는 방법 변수의 스코프와 라이프타임 타입 변환, 캐스팅 그리고 타입 프로모션 1차 및 2차 배열 선언하기 타입 추론, var 학습 내용 정리 프리미티브 타입 종류와 값의 범위 그리고 기본 값 이름 크기 값 범위 기본 값 비고 byte 1 byte -128 ~ 127 0 short 2 bytes -32,768 ~ 32,767 0 signed int 4 bytes $-2^{31}$ ~ $2^{31}-1$ 0 unsigned int 4 bytes 0 ~ $2^{32}-1$ 0 java 8 이상부터 가능 signed.. 2023. 4. 12. 이전 1 2 3 4 ··· 14 다음 728x90