목록분류 전체보기 (531)
개발놀이터
*HTTP (HyperText Transfer Protocol) 원래 는 html을 전송하기위해 만들어졌지만 요즘은 html, text, image, 음성, 영상, 파일, json, xml 거의 모든 형태의 데이터 전송 가능 HTTP 특징 1. 클라이언트 서버 구조 2. 무상태 프로토콜, 비연결성 3. HTTP 메시지로 통신 4. 단순함, 확장 가능 1. 클라이언트 서버 구조 1-1. Request Response 구조 1-2. 클라이언트는 서버에 요청을 보내고, 응답을 대기 1-3. 서버가 요청에 대한 결과를 만들어서 응답 2. 무상태 프로토콜, 비연결성 무상태 = stateless 2-1. 서버가 클라이언트의 상태를 보존X 2-2. 장점 : 서버 확장성 높음 2-3. 단점 : 클라이언트가 추가 데이터..
*인터넷 네트워크 *IP (인터넷 프로토콜) 역할 1. 지정한 IP 주소에 데이터 전달 2. 패킷이라는 통신 단위로 데이터 전달 처음에 내가 원하는 정보를 상대방에게 전달하고 싶으면 IP패킷이라는 곳에 출발IP주소 도착IP주소를 적고 안에 메시지를 적어 넣고 인터넷에 던진다. 그럼 인터넷에서 도착 IP주소를 갈 수 있는 곳을 서로 물어가며 전달이 된다. IP프로토콜의 한계 1. 비연결성 : 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷 전송 2. 비신뢰성 : 중간에 패킷이 사라지면? 패킷이 순서대로 안오면? 3. 프로그램 구분 : 같은 IP를 사용하는 서버에서 통신하는 애클리케이션이 둘 이상이면? *TCP IP에서 생긴 한계점을 해결하기 위해 생겨난 개념이다. IP패킷에선 출발지IP, 목적지IP,..
*스트림 API Java SE 8 부터 추가된 스트림 API는 파일입출력에서의 스트림과는 전혀 다른 개념이다. 자바에서는 많은 양의 데이터를 저장하기 위해서 배열이나 컬렉션을 사용한다. 이렇게 저장된 데이터에 접근하기 위해서는 반복문이나 반복자를 사용하여 매번 새로운 코드를 작성해야한다. 하지만 이렇게 작성된 코드는 길이가 너무 길고 가독성도 떨어지며, 코드의 재사용이 거의 불가능하다. 즉, 데이터베이스의 쿼리와 같이 정형화된 처리 패턴을 가지지 못했기에 데이터마다 다른 방법으로 접근해야만 했다. 이러한 문제점을 극복하기 위해서 Java SE 8 부터 스트림 API를 도입했다. 스트림 API는 데이터를 추상화하여 다루므로, 다양한 방식으로 저장된 데이터를 읽고 쓰기 위한 공통된 방법을 제공한다. 따라서 ..
*람다 표현식 람다 표현식이란 간단히 말해 메소드를 하나의 식으로 표현한 것이다. int min(int x, int y) { return x x { 함수몸체 } 자바에서 람다 표현식을 작성할 때 유의해야할 사항은 다음과 같다. 1. 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있다. 2. 매개변수가 하나인 경우에는 괄호를 생략할 수 있다. 3. 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호를 생략할 수 있다. 4. 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호를 생략할 수 있다. 5. return 문 대신 표현식을 사용할 수 있으며, 이때 반환값은 표현식의 결괏값이 된다.
*빈 스코프 일반적으로 스프링 빈은 스프링 컨테이너의 시작과 함께 생성되어서 스프링 컨테이너가 종료될 때 까지 유지된다. 이것은 스프링 빈이 기본적으로 싱글톤 스코프로 생성되기 때문이다. 스코프는 번역 그대로 빈이 존재할 수 있는 범위를 뜻한다. 스프링은 다음과 같은 다양한 스코프를 지원한다. 1. 싱글톤 : 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다. 2. 프로토타입 : 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짧은 범위의 스코프이다. 3. 웹 관련 스코프 3-1. request : 웹 요청이 들어오고 나갈때 까지 유지되는 스코프이다. 3-2. session : 웹 세션이 생성되고 종료될 때 까지 유지되는 ..
*빈 생명주기 콜백 1. 인터페이스 사용 2. 설정 정보에 초기화 메서드, 종료 메서드 지정 3. @PostConstruct, @PreDestroy 어노테이션 지원 1. 인터페이스 사용 implements InitializingBean, DisposableBean을 선언해준다. 그 후에 afterPropertiesSet(), distroy()메서드를 작성하면 된다. afterPropertiesSet() 은 생성자 호출하고 초기화가 다 끝나면 그때 호출이 된다. distroy()는 스프링이 내려갈때 맨 마지막에 호출해준다. 초기화, 소멸 인터페이스 단점 1. 이 인터페이스는 스프링 전용 인터페이스이다. 해당 코드가 스프링 전용 인터페이스에 의존한다. 2. 초기화, 소멸 메서드의 이름을 변경할 수 없다. 3..
*@Autowired 스프링 빈의 의존관계를 자동으로 주입해주는 어노테이션이다. @Component 어노테이션으로 컴포넌트 스캔으로 등록된 클래스에서만 사용이 가능 하다. 컴포넌트 스캔으로 등록되지 않은 클래스에서 Autowired만 선언하면 아무런 의미가 없다. 기존의 @Bean을 이용하여 스프링빈에 등록하고 의존관계를 주입하는 것보다 훨씬 편한 방법으로 의존관계를 주입할 수 있다. 객체지향언어가 가져야할 원리다섯가지 SOLID의 D에 해당하는 DIP에 부합하는 어노테이션이다. *@Component 컴포넌트 스캔을 실행할 때 스캔 대상이다. 스프링은 @ComponentScan 어노테이션을 보면 @Component 가 붙어있는 클래스들을 쭉 돌아서 찾아내고 스프링빈으로 등록한다. 스프링 빈에 등록된 빈들..
*모든 빈 출력하기 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); @Test @DisplayName("모든 빈 출력하기") void findAllBean() { String[] beanDefinitionNames = ac.getBeanDefinitionNames(); for(String beanDefinitionName : beanDefinitionNames){ Object bean = ac.getBean(beanDefinitionName); System.out.println("name = " + beanDefinitionName + " object = " + bean); } }..
Controller : 컨트롤러를 통해서 외부 요청을 받고 Service : 서비스에서 비즈니스 로직을 만들고 Repository : 리포지토리에서 데이터를 저장하고 =정형화된 패턴 Autowired : 내가 현재 작업하는 클래스에서 다른 클래스의 객체를 사용하고 싶을 때는 현재 작업하는 클래스에서 new 하고 객체를 다른 클래스의 객체를 만드는 것이 아니라 private final 다른클래스 객체명; 이렇게 선언해 준 뒤에 @Autowired public 현재작업중인클래스(다른클래스 객체명){ this.객체명 = 객체명 } 이렇게 구현하면 된다. => 해당 방법은 Dependency Injection 즉 DI중 생성자 주입이라고 부른다. *DI란? 의존성 주입이라고 표현하고 DI에는 세가지 주입이 있다..
*Test클래스 작성 테스트 클래스를 만들고 난 후에 테스트 할 함수 위에 @Test 어노테이션을 붙인다. 클래스 옆에있는 화살표를 누르고 Run을 누르면 테스트가 시작된다. 테스트를 진행할 때 given(어느것이 주어지는지) when(이 부분이 실행될 때) then(이러한 결과가 나온다) 이 세개를 주석처리 하고 그 아래 쓰는것이 가독성을 높인다. 객체가 같은지 확인시켜주는 Assertions클래스가 두개 있는데 java.assertj.core.api를 고르면 된다. Assertions.assertThat(기준되는객체).isEqualTo(테스트할객체) 이렇게 넣으면 됨 테스트 하나가 끝날 때 마다 실행하는 @AfterEach 어노테이션이 있는데 이 어노테이션을 붙이면 테스트가 하나 끝날때마다 실행시켜준..