본문 바로가기

Today I Learned26

[DailyLog] package org.springframework.beans.factory.annotation does not exixt 상황 인텔리제이로 작업 중이었던 프로젝트가 갑자기 실행이 안되고 다음과 같이 빨간줄 천지가 되었다. package org.springframework.beans.factory.annotation does not exist cannot find symbol class Bean 해결 1 IntelliJ 상단 메뉴 중 Build에서 Rebuild Project를 클릭하여 프로젝트를 새로 빌드한다. 해결 2 우측 Gradle 창에서 프로젝트에 우클릭 후 Refresh Gradle Dependencies를 클릭한다. 2024. 2. 15.
[DaliyLog] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning 상황 새 프로젝트를 진행하면서 Jpa와 MySQL을 연동하는 중 다음과 같은 경고가 떴다. WARN 8604 --- [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning 해결 SpringBoot는 기본적으로 spring.jpa.open-in-view이 true로 설정되어 있고, 랜더링 중에 database 쿼리가 실행될 수 있다고 한다. 그러므.. 2024. 2. 5.
[Java] char 배열을 문자열로 변환 String(배열명) public class Main { public static void main(String[] args) { char[] arr = {'I','a','m','사','랑','이','에','요'}; String result = new String(arr); System.out.println("result = " + result); } } // result = Iam사랑이에요 char 배열이 있다면 반복문을 쓰지 않고 문자열로 합성하는 법이 있다. String(배열 이름)을 하면 한 번에 문자열로 만들어준다. 2023. 11. 28.
[Java] 절대값 구하기 Math.abs( ) Math.abs( ) int, long, double, float 타입을 입력받아 절대값을 반환한다. public class Main { public static void main(String[] args) { int num1 = -3; long num2 = -534978333; double num3 = -3.235; float num4 = -1.234f; System.out.println("Math.abs(num1) = " + Math.abs(num1)); System.out.println("Math.abs(num2) = " + Math.abs(num2)); System.out.println("Math.abs(num3) = " + Math.abs(num3)); System.out.println("Mat.. 2023. 11. 22.
[Java] long 범위보다 큰 정수를 사칙연산하기: BigInteger BigInteger int, double, long 자료형 중에서 가장 범위가 넓은 long의 범위는 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807이다. 만약 long의 범위를 초과하는 수를 다룰 때는 BigInteger 클래스를 사용할 수 있다. BigInteger는 문자열로 표현된 숫자를 입력받아 객체를 생성한다. 이후 사칙연산을 수행하는 각 메서드를 호출하여 다음과 같이 활용할 수 있다. import java.math.BigInteger; public class Main { public static void main(String[] args) { String a = "12938475029384752983749875"; String b = "2398.. 2023. 11. 10.
[Java] 문자열을 공백 기준으로 나누어 배열 만들기: split( ), 마지막 공백 처리 공백을 기준으로 배열 만들기 public class Main { public static void main(String[] args) { String my_string = "i love you"; String[] arrStr = my_string.split(" "); String my_string2 = "a, b, c"; String[] arrStr2 = my_string2.split(","); System.out.println(Arrays.toString(arrStr)); System.out.println(Arrays.toString(arrStr2)); } } // [i, love, you] // [a, b, c] split( ) 메서드를 이용하면 괄호 안의 값을 기준으로 문자열을 나눌 수 있다. 마지.. 2023. 11. 4.
[Spring] 여러가지 의존관계 주입 방식 생성자 주입 방식 4가지 생성자 주입 수정자 주입(setter 주입) 필드 주입 일반 메서드 주입 의존관계 주입 방식은 위와 같이 4가지가 있다. 각각의 방식을 알아보고 생성자 주입 방식을 왜 써야하는지 알아본다. 생성자 주입 생성자를 통해서 의존관계를 주입받는 방식이다. 가장 대중적으로 쓰이고 선호되는 방식이다. 생성자 주입 방식은 생성자를 호출하는 시점에 딱 1번만 호출되는 것이 보장된다. 처음 주입이 이뤄지고 난 후에는 변경사항이 없다는 것이다. 생성자 주입 방식은 또한 필수적인 의존관계에 사용되는 방식이다. 다음 OrderServiceImpl 클래스 코드를 보자. @Component public class OrderServiceImpl implements OrderService { private .. 2023. 11. 3.
[Spring] 싱글톤을 관리하는 스프링 컨테이너 싱글톤 컨테이너 역할을 하는 스프링 컨테이너 스프링 컨테이너는 기존 싱글톤 패턴의 문제점을 해결하고 객체 인스턴스를 한 개만 생성하여 관리한다. 잘 알고 있는 스프링 빈이 스프링 컨테이너에 의해 싱글톤으로 관리된다. 스프링 컨테이너 싱글톤 객체를 관리하므로 여러 장점이 있는데, 먼저 싱글톤 패턴을 위해서 코드를 작성하지 않아도 된다는 점이다. 그리고 앞서 싱글톤 패턴의 문제점으로 말했던 DIP, OCP, 테스트, private 생성자로부터 제한없이 싱글톤을 사용할 수 있다. @Test void springContainer() { ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); MemberService memb.. 2023. 11. 2.
[Spring] 싱글톤 패턴(Singleton Pattern) 요청 시 객체를 생성하는 구조 웹 어플리케이션이 있다. 고객들이 요청할 때마다 AppConfig(스프링 없는 순수한 DI 컨테이너)는 객체를 새로 생성할 것이다. 100개의 요청이 들어오면 100개의 객체가 생성이 되고 소멸 될 것이다. 이 서비스가 인기가 더 많아지면 초당 10,000개 이상의 객체를 생성하고 소멸될 수도 있다. 다음은 스프링이 없는 순순한 DI 컨테이너를 나타낸 코드이다. public class SingletonTest { @Test void pureContainer() { AppConfig appConfig = new AppConfig(); MemberService memberService1 = appConfig.memberService(); MemberService memberSe.. 2023. 11. 1.
[Java] ArrayList에서 특정 값 인덱스 구하기 indexOf 배열에서는 indexOf()가 지원이 안된다. 배열에서 특정 값 인덱스를 구하려면 asList()를 이용하여 ArrayList로 변환하는 방법이 있다. indexOf( ) import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { String[] arr = {"apple", "banana", "graph"}; List list = Arrays.asList(arr); System.out.println(list.indexOf("banana")); // 1 } } 2023. 10. 30.
[Memory] 내가 쓰는 IntelliJ 단축키 2(Update) CTRL + SHIFT + T : 테스트 클래스 자동 생성 테스트 클래스 뿐만 아니라, 패키지까지 자동 생성 해준다. ALT + ENTER : import static 예를 들어 Assertions를 사용할 때, import static을 하면 다음부턴 Assertions.를 생략할 수 있다. "iter" + tab : for 문 자동 생성 리스트나 배열이 있으면 for 문을 자동으로 생성해준다. 2023. 10. 28.
[Spring] SOLID 좋은 객체 지향 설계의 5가지 원칙 SOLID 좋은 객체 지향 설계의 5가지 원칙 클린 코드의 저자로 유명한 로버트 마틴이 정리한 좋은 객체 지향 설계의 5가지 원칙이다. 시간이 지나도 유지 보수와 확장이 쉬운 시스템을 개발하고자 하는 프로그래머들은 이 원칙들을 적용할 수 있다. SRP (Single Responsibility Principle) : 단일 책임 원칙 OCP (Open/Closed principle) : 개방/폐쇄 원칙 LSP (Liskov Substitution Principle) : 리스코프 치환 원칙 ISP (Interface Segregation Principle) : 인터페이스 분리 원칙 DIP (Dependency Inversion Principle) : 의존관계 역전 원칙 SRP 단일 책임 원칙 (Single R.. 2023. 10. 27.
[Java] Integer 타입 ArrayList를 int 타입 배열로 변환 주저리주저리 코딩테스트 연습 중 int형 배열을 정답으로 반환해야 하는 상황. 필자는 매번 Integer 타입의 ArrayList를 반환하여 'cannot be converted to int'라는 오류를 만난다. 그만 까먹고 싶어서 기록한다. 본론 List list = new ArrayList(); list.add(1); list.add(2); int[] arr = list.stream() .mapToInt(i -> i) .toArray(); Integer타입 ArrayList를 선언하고 데이터를 삽입한다. 그 이후 list를 stream으로 변환한 후 mapToInt와 toArray()를 이용하여 int형 배열로 만든다. 2023. 10. 26.
[Memory] 내가 쓰는 IntelliJ 단축키 CTRL + P : 괄호 값 안내 괄호에 빨간 밑 줄이 그어져있다면 ctrl + P를 눌러서 인자 값을 확인할 수 있다. CTRL + ALT + V : 해당 메소드의 변수 데이터 타입 추출 Optional, List 등 선언을 바로 해준다. CTRL + ALT + M : 메서드 추출 ALT + ENTER : 람다식으로 변경 CTRL + ALT + N : inLine 하나의 라인으로 만들어준다. ALT + INSERT : 생성자(Generate) 자동 생성 Generate 창을 열어 생성자를 손쉽게 자동 생성할 수 있다. Getter & Setter 등 다른 기능들도 자동 생성할 수 있다. 2023. 10. 25.
[DailyLog] Windows Hello 지문과 호환되는 지문 스캐너를 찾을 수 없습니다. 상황 필자는 삼성전자 갤럭시북 이온 NT950XCR-A58A를 사용하고 있다. 노트북 로그인 시 평소에 잘 되던 지문 인식이 안되어 로그인 옵션에 갔더니 Windows Hello 뭐시기 오류가 떠있는 것을 확인했다. 구글링을 해보니 삼성전자 노트북 뿐만 아니라 Windows 기반인 많은 노트북들이 고통을 받고 있는 것을 확인했다. 여러 방법을 한 결과 지문 인식 되살리는데 성공했고, 그 해결 방법을 남기려고 한다. 해결 먼저 장치 관리자를 검색한다. 상단 메뉴 보기에서 숨겨진 장치 표시를 클릭한다. 생체 인식 장치를 찾아본다. 필자는 CanVasBio Fingerprint Driver을 확인할 수 있는데 기기마다 다른 드라이버가 있을 것 같다. 이 드라이버를 더블 클릭한다. 상단 메뉴 드라이버를 클릭 후.. 2023. 10. 24.
[DailyLog] A problem occurred configuring root project 'hello-spring'. 상황 Spring Initializr에서 프로젝트 생성 후 IntelliJ에서 실행을 했더니 다음과 같은 무시무시한 오류가 떴다. 더보기 A problem occurred configuring root project 'hello-spring'. > Could not resolve all files for configuration ':classpath'. > Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.0.0. Required by: project : > org.springframework.boot:org.springframework.boot.gradle.plugin:3.0.0 > No matching variant of o.. 2022. 12. 15.
[DailyLog] Postman Status: 401 Unauthorized 상황 간단한 프로젝트를 위한 Spring MVC 계층을 만들고 분명 포스트맨으로 요청과 응답을 잘 주고 받는 것을 확인하였다. Spring Security 의존성만 더 추가된 팀원의 프로젝트를 나의 로컬로 pull 하였다. 그런데 갑자기 포스트맨이 응답이 없어지고 포스트맨에 'Status: 401 Unauthorized' 에러가 떴다. Unauthorized를 보니 Spring Security 의존성과 관련된 문제인 것 같다. 해결 기존의 작업을 이어나가기 위해 두 가지 방법을 알아냈다. 첫 번째 방법은 위 의존성을 주석처리하고 작업을 진행하는 것이다. 두 번째 방법은 @SpringBootApplication 옆에 (exclude = {SecurityAutoConfiguration.class})을 추가하.. 2022. 10. 27.
[Spring] 프록시 서버 Proxy Server 프록시 서버는 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 주는 컴퓨터 시스템이나 응용 프로그램을 말한다. 즉, 클라이언트가 서버와 연결될 때 서버에 바로 접근하지 않고 자신을 통해 접근할 수 있도록 해주는 대리 역할을 하는 서버이다. 프록시 서버는 위치에 따라서 Forward Proxy와 Reverse Proxy 두 가지로 나뉜다. Forward Proxy 클라이언트에 가까이 위치한 프록시 서버를 Forward Proxy라고 한다. Forward Proxy는 클라이언트가 동일한 요청을 보낼 때 서버에 재요청을 하지 않고 캐시에 저장해놓은 결과 데이터로 응답한다. 따라서 요청 결과를 클라이언트에게 빠르게 전달할 수 있는 장점이 있다. 또한 서버에.. 2022. 10. 11.
[Spring] Spring Security의 웹 요청 처리 흐름 Spring Security를 애플리케이션에 적용하는데 어려움을 겪는 가장 큰 이유 중 하나는 Spring Security의 아키텍쳐와 Spring Security의 컴포넌트들이 어떻게 인터랙션해서 인증, 권한 등의 보안 작업을 처리하는지 이해하지 못하기 때문이다. 그리고 이러한 Spring Security의 동작 방식을 조금 더 잘 이해하기 위해서는 보호된 웹 요청을 처리하는 일반적인 처리 흐름과 Spring Security에서 지원하는 Filter의 역할을 이해하는 것이 선행되어야 한다. 따라서 오늘은 Spring Seucrity의 웹 요청 처리 과정 중에서 가장 기본이 되는 웹 요청의 일반적인 흐름과 Spring Security에서 지원하는 Filter의 역할에 대해 알아보겠다. 보안이 적용된 웹 .. 2022. 9. 28.
[Spring] Spring Security 커피를 주문할 수 있는 커피 주문 어플리케이션을 만들었다. 보안을 전혀 고려하지 않은 상태로 오픈을 하였다고 가정하면 어떤 문제가 발생할 수 있을까? 로그인(인증, Authentication) 기능이 없다. 로그인 기능이 없다면 자신을 증명할 방법이 없기 때문에 다른 사람이 회원으로 등록한 내 정보 또는 내가 주문한 정보 등에 대해서 애플리케이션의 API 호출해서 얼마든지 조회가 가능하게 된다. 이 상태로는 다른 사람의 개인정보를 탈취하는 것은 식은 죽 먹기가 될 것이다. API에 대한 권한 부여(인가, Authorization) 기능이 없다. 커피를 주문하는 손님은 메뉴판에 카페의 커피 정보를 마음대로 등록할 수 없어야 한다. 하지만 API에 대한 접근 권한이 부여되지 않는다면 손님이 마음대로 카페 메.. 2022. 9. 27.
[Spring] API 문서화 API 문서화 Controller는 클라이언트 쪽에서 HTTP request URL을 통해 클라이언트의 요청을 전달 받는다. 그런데 백엔드 애플리케이션은 REST API 방식의 애플리케이션이다. 따라서 API 문서화란 클라이언트가 REST API 백엔드 애플리케이션에 요청을 전송하기 위해서 알아야 되는 요청 정보(요청 URL(또는 URI), request body, query parameter 등)를 문서로 잘 정리하는 것을 의미한다. API 문서 생성의 자동화 API 사용을 위한 어떤 정보가 담겨 있는 문서를 API 문서 또는 API 스펙이라고 한다. API 문서는 개발자가 요청 URL 등의 API 정보를 직접 수기로 작성할 수도 있고, 애플리케이션 빌드를 통해 API 문서를 자동 생성할 수도 있다. .. 2022. 9. 26.
[Spring] JPA 엔티티 간 연관 관계 매핑 엔티티 클래스 간의 관계를 만들어주는 것을 연관 관계 매핑이라고 한다. 연관 관계 매핑은 참조하는 방향성을 기준으로 단방향 연관 관계와 양방향 연관 관계로 구분할 수 있다. 그리고 참조할 수 있는 객체의 수에 따라서 일대다(1:N), 다대일(N:1), 다대다(N:N), 일대일(1:1)의 연관 관계로 나눌 수 있다. 카페에서 커피를 주문할 수 있는 커피주문 애플리케이션에서 회원 정보인 Member 클래스와 주문 정보인 Order 클래스의 관계를 살펴보겠다. 단방향 연관 관계 위 그림에서 Member 클래스는 Order 객체를 원소로 포함하고 있는 List 객체를 가지고 있으므로 Order를 참조할 수 있다. 즉 Member는 Order의 정보를 알 수 있다. 반면에 Order 클래스는 Member 클래스에.. 2022. 9. 25.
[Spring] DTO(Data Transfer Object) DTO (Data Transfer Object) DTO는 Data Transfer Object의 약자로 마틴 파울러(Martin Fowler)가 ‘Patterns of Enterprise Application Architecture’ 라는 책에서 처음 소개한 엔터프라이즈 애플리케이션 아키텍처 패턴의 하나이다. Transfer 라는 단어에서 알 수 있듯이 데이터를 전송하기 위한 용도의 객체 정도로 생각할 수 있다. 바로 클라이언트에서 서버 쪽으로 전송하는 요청 데이터, 서버에서 클라이언트 쪽으로 전송하는 응답 데이터의 형식으로 클라이언트와 서버 간에 데이터 전송이 이루어지는데 이 구간에서 DTO를 사용할 수 있다. DTO가 필요한 이유 1. DTO 클래스를 이용한 코드의 간결성 @RestController.. 2022. 9. 24.
[Spring] Controller Controller 부트스트랩(Bootstrap) 애플리케이션이 실행되기 전에 여러가지 설정 작업을 수행하여 실행 가능한 애플리케이션으로 만드는 단계를 의미한다. @RestController Spring MVC에서는 특정 클래스에 @RestController를 추가하면 해당 클래스가 REST API의 리소스를 처리하기 위한 API 엔드포인트로 동작함을 정의한다. 또한 @RestController가 추가된 클래스는 애플리케이션 로딩 시, Spring Bean으로 등록해준다. @RequestMapping @RequestMapping은 클라이언트의 요청과 클라이언트 요청을 처리하는 Handler Method를 매핑해주는 역할을 한다. @RequestMapping을 Controller 클래스 레벨에 추가하여 클.. 2022. 9. 23.
[Spring] Spring MVC 아키텍처 Spring MVC Spring MVC는 클라이언트의 요청을 편리하게 처리해주는 프레임워크이다. 개발자들 사이에서 Spring Web MVC를 줄여서 Spring MVC라고 부르고, Spring MVC는 웹 프레임워크의 한 종류이기 때문에 Spring MVC 프레임워크라고도 불린다. Spring MVC에서 M은 Model을 뜻한다. 클라이언트에게 응답으로 돌려주는 작업의 처리 결과 데이터를 Model이라고 한다. Spring MVC에서 V는 View를 의미한다. View는 Model 데이터를 이용하여 웹브라우저와 같은 클라이언트 애플리케이션의 화면에 보여지는 리소스(Resource)를 제공한다. 또한 View는 JSON 포맷의 데이터를 생성한다. Spring MVC에서 C는 Controller를 의미한다.. 2022. 9. 22.
[Spring] Spring Framework 특징(POJO, IoC/DI, AOP, PSA) Spring 삼각형 위 그림은 Spring 핵심개념들을 표현하는 Spring 삼각형이다. POJO라는 것을 IoC/DI, AOP, PSA를 통해서 달성할 수 있다는 것을 의미한다. POJO (Plain Old Java Object) Plain은 플레인 요거트를 떠올리면 이해하기 쉽다. 플레인 요거트는 과일이나 시리얼이 들어가지 않은 순수한 요거트를 의미한다. 즉 POJO란 Java로 생성하는 순수한 객체를 말한다. POJO를 이용해서 프로그래밍 코드를 작성하는 것을 POJO 프로그래밍이라고 하는데 이 POJO 프로그래밍에도 규칙이 있다. Java나 Java의 스펙에 정의된 것 이외에는 다른 기술이나 규약에 얽매이지 않아야 하며 특정 환경에 종속적이지 않아야 한다. POJO 프로그래밍이 필요한 이유 1. .. 2022. 9. 21.