전체 글 143

진작 쓸걸... 진행도 80%

진작 중간중간 진행도와 오류 내용, 해결법 등을 정리했으면 좋았을 것이라는 생각이 든다. 이미 늦었지만, 늦었다고 아무것도 안하는 것보다는 쓰는게 그나마 나으니 일단 쓴다. 목적: 각 거래소의 api를 활용해 서로 다른 거래소에서의 거래 기록과 보유 코인을 한눈에 보기 쉽게 관리하기. 진행도 : 80% - 바이낸스, 업비트, 코인원 3개 거래소를 만들기로 계획했고, 바이낸스를 제외한 나머지 두개 구현 완료 마주친 문제들: 대부분 바이낸스쪽의 문제. 바이낸스는 코드 예시도 정확히 없을 뿐더러, 설명이 불친절하고 다른 거래서 api에서 제공하는 기능을 제공하지 않는 경우가 많았음(ex) 내가 산 가격 정보 등). 이를 해결하기 위해 진행 시간의 50%이상을 소요함. 현재 문제: 스프링 시큐리티 문제. 시큐리..

(9)빈 스코프

스코프란? 빈의 존재 방식을 말한다. 스코프 종류에 따라 빈은 컨테이너에게 관리받는 시점을 조절하거나 객체가 유지되는 기간을 설정할수 있다. 스코프의 종류 싱글톤: 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다. 프로토타입: 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다. 웹 관련 스코프 request: 웹 요청이 들어오고 나갈때 까지 유지되는 스코프이다. session: 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프이다. application: 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프이다 스코프의 등록법 @Scope("[스코프 종류]") 를 사용하면 된다. 자동 등록 빈이건 수..

카테고리 없음 2023.06.05

(8) 빈 생명주기 콜백

스프링 빈(싱글톤)의 생명 주기 스프링 컨테이너 생성 -> 스프링 빈 생성(생성자 함수 실행, 생성자 주입 실행) -> 의존관계 주입(생성자 주입을 제외한 의존관계 주입) -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료 초기화 콜백, 소멸전 콜백은 스프링에서 자체적으로 지원하는 기능이다. 코드로 예시를 살펴보자. #AutoConnect public class AutoConnect { private String fieldA; public AutoConnect() { System.out.println("AutoConnect 객체 생성됨"); System.out.println("field=" + fieldA); connect(); call("초기화 연결 메시지"); } public void s..

카테고리 없음 2023.06.05

(7)의존 관계 주입

의존 관계 주입의 4가지 방법 의존 주입에는 4가지 방법이 존재한다. 1. 생성자 주입 2. 수정자 주입(setter 주입) 3. 필드 주입 4. 일반 메서드 주입 1. 생성자 주입 생성자 함수를 통한 주입 방법으로, 주입받는 의존관계 객체가 코드가 진행되는 동안 불변하며 필수적일 경우 사용한다. public class TowAlphabet { private final Alphabet first; private final Alphabet second; @Autowired public TowAlphabet(Alphabet a, Alphabet b) { first = a; second = b; } } 만약 생성자가 딱 1개만 있으면 @Autowired를 생략해도 자동주입이 된다. public class To..

카테고리 없음 2023.05.22

(6)빈 자동 등록과 자동 주입

@ComponentScan 과 @Autowired 개발자의 편의를 위해 @Configuration 클래스 내에서 @Bean을 통해 수동으로 등록하지 않고 자동으로 등록하는 방법이 존재한다. @ComponentScan 어노테이션을 사용하면, @Component 어노테이션이 붙은 클래스가 자동으로 빈으로 등록된다. 빈 이름은 첫글자가 소문자인 클래스 이름 그대로 설정된다. #AutoAppConfig @Configuration @ComponentScan(excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Configuration.class)) public class AutoAppConfig { } // 기존에 만든 Config 클래스를 제외하기 ..

공부/springboot 2023.05.15

(5) 스프링 컨테이너 - 싱글톤

스프링은 태생적으로 웹 어플리케이션에 특화되어 있는데, 웹 어플리케이션은 보통 같은 요청이 동시다발적으로 들어오곤 한다. 만약 100명의 고객이 동일한 요청을 한다고 가정해보자. 그러면 동일한 역할을 하는 객체를 100개를 생성하게 될 것이다. 그런데 그 요청이 모든 고객에게 공통적인 사항이라면 (ex - 공지사항 출력, 판매 상품 출력 등) 100개의 객체를 생성하는 것보다 1개의 객체를 100명이 공유하는게 메모리 측면에서 더 효율적일 것이다. 즉, 싱글톤을 사용해야 한다. 순수 싱글톤 만들기 자바 코드를 사용하지 않고 싱글톤 패턴을 만들수 있다. 핵심은 아래와 같다. 1. static키워드를 사용해서 미리 자신의 인스턴스를 만들어두고, final키워드를 더해 재할당이 안되도록 만든다. 2. 매개변수..

공부/springboot 2023.05.14

(4) xml을 통한 빈 등록과 BeanDefinition

빈을 XML로도 등록이 가능하다, 이는 매우 귀찮고 최근에는 사용하지 않는 한물간 방식이다. 따라서 등록 원리에 대해서만 간단하게 설명하고 넘어가도록 하겠다. ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml"); AnnotationConfigApplicationContext() 처럼 GenericXmlApplicationContext를 사용해 xml파일을 넘기면, 해당 파일 내부에서 Bean으로 등록하도록 설정한 클래스들이 빈으로 등록된다. 아래의 xml파일을 보자. id 는 빈이 등록되는 이름, class는 빈으로 등록할 클래스의 경로가 된다. 만약 빈으로 등록하려는 객체가 생성자 함수를 통해 매개변수를 주입받아야 하면 다..

카테고리 없음 2023.05.10

(3) 스프링 컨테이너와 빈 조회

스프링 컨테이너 스프링 컨테이너의 종류 BeanFactory 스프링 컨테이너 최상의 인터페이스다. 스프링 빈을 관리, 조회하는 역할을 담당한다. getBean()을 비롯하여 다수의 기능을 제공한다. ApplicationContext BeanFactory를 상속받는 인터페이스다. 국제화기능, 환경변수, 어플리케이션 이벤트 등 다양한 추가 기능을 제공한다. BeanFactory를 직접 사용할 일은 거의 없다. 부가기능이 포함된 ApplicationContext를 사용한다. BeanFactory나 ApplicationContext를 스프링 컨테이너라 한다 AnnotationConfigApplicationContext : ApplicationContext의 구현체다. 생성자 함수에 @Configuration 클..

공부/springboot 2023.05.10

(2) 스프링을 활용한 DI

앞서 보았던 순수 자바코드만을 활용한 DI는 한눈에 의존관계를 파악하기 힘들었다. 스프링은 이러한 문제를 해결하기 위해 Bean 컨테이너를 제공한다. Bean이란 스프링에서 관리해주는 객체를 의미한다. 만약 어떤 객체가 빈으로 등록되어 있다면, 그 객체를 주입 받을때 스프링 컨테이너에서 자동으로 해주기때문에 편리하다. 먼저 주입 객체들을빈으로 등록하자. # Config @Configuration public class Config { @Bean public Alphabet alphabet(){ return new B(); } } @Configuration : 스프링 설정 클래스라는 것을 의미한다. 빈을 수동으로 등록해줄수 있다. @Bean : 메서드의 반환 객체를 빈으로 등록한다. 빈 이름은 메서드 이름..

공부/springboot 2023.05.10

(1) 스프링 사용하지 않고 OCP, DIP 지키기

아래의 코드는 Alphabet 이라는 인터페이스와 그를 상속받는 A, B의 클래스다. 여기서 className 이라는 메서드는 각각 자신의 클래스 이름 A, B를 출력하게 된다. # 인터페이스 public interface Alphabet { void className(); } # 구현체 A public class A implements Alphabet{ @Override public void className() { System.out.println("A"); } } # 구현체 B public class B implements Alphabet{ @Override public void className() { System.out.println("B"); } } 이때 인터페이스 Alphabet을 참조하면서..

공부/springboot 2023.05.10