Spring (2023.04.17)

상목·2023년 4월 17일
0

Spring

목록 보기
2/6

<아파치 - 오픈소스>

-> 웹서버
-> 정적파일 (HTML, CSS, JAVASCRIPT)
-> 정적 리소스 (저장된 이미지, 동영상 등)

<아파치 톰갯 (Apache Tomcat)>

-> 웹 애플리케이션 서버
-> 동적 파일(JSP, Servlet 등 )

<Servlet 예시>

<JSP 예시>

<아파치와 톰캣의 작동 흐름>

<자바 객체와 JSON>

자바객체 : 대상을 추상화 한 자바 코드 (시스템에서 0101 이진데이터로 변환)
JSON : 대상을 추상화 한 문자열 데이터

<Stream 스트림>

-> 개별 바이트나 문자열인 데이터의 원천
-> 데이터가 전송되는 통로
-> 키보드, 파일, 네트워크 등등

<직렬화 Serialize>

-> 객체를 데이터 스트림(문자열)으로 만드는 것
-> 객체에 저장된 데이터를 스트림에 쓰기 위해 연속적인 데이터로 변환하는 것

<역 직렬화 Dexerialization>

-> 스트림을 객체로 만드는 것

<직렬화와 역직렬화를 하는 이유>

-> 다른 기족간의 데이터 송수신을 위해 필요하다.
-> java객체 -> 직렬화 -> json -> 역직렬화 -> python객체로 변환
-> 다른 언어에서도 사용

<라이브러리와 프레임워크>

라이브러리 : 개발자가 제어하기 때문에 유연성과 자유도가 높음
프레임워크 : 프레임워크가 제어하기 때문에 개발자의 유연성과 자유도가 낮음

<프레임 워크를 쓰는 이유>

1) 협업 : 구조가 같아 협업이 쉬움
2) 안정성 : 확인해야할 사항들을 프레임워크가 체크함
3) 보안 : 웹 관련 공격을 막을 방법을 미리 세팅해 놓음
4) 신입 : 가이드가 없으면 신입은 코드를 짜기가 어려움

<Spring Bean ?>

-> Spring IoC 컨테이너가 관리하는 자바 객체
-> 생성방법만 명시하면 스프링이 알아서 객체를 생성하고 유지하고 소멸시킨다.

<출력>

-> @Bean, @Component에 어노테이션을 붙이면 Spring IoC 컨테이너가 장동으로 해당 객체를 생성해준다.
-> 해당객체를 필요로 하는 다른 객체에 주입 시켜준다 DI


-> 우리는 단 한번도 new 생성자를 써서 객체를 만들지 않았다 = 제어의 역전(IoC - 프레임워크가 컨트롤한다.)


-> 여러번 생성할 필요가 없는 객체는 스프링이 싱클돈처럼 관리한다.


<메타/합성 어노테이션>

메타 어노테이션 : 어노테이션에 붙을 수 있는 어노테이션
합성 어노테이션 : 어노테이션을 여러개 붙인것

<Spring 어노테이션 - Bean 등록 방법>

@Bean 와 @Component 를 주로 사용하게 됨.

<스프링 어노테이션 - Bean스캔 및 생성>

@ComponentScan 어노테이션이 붙은 패기지는 하위의 모든 @Bean과 @Component를 스캔하여 객체를 생성

<스프링 어노테이션 : DI>

@Autowired - 타입으로 주입 (없으면 이름으로) = 생성자 생성과 같은 효과, setter/생성자/필드에 붙힐수 있다.

private -> 객체가 생성되고나서 setter로 수정이 가능

private final -> 객체가 생상되고나서 변경 불가능 : 스프링이 강제로 주입하라고 시키는 것.

-> Spring IOC 컨테이너가 관리
-> ComponentScan으로 Bean/Component를 찾아서 객체를 생성
-> 생성한 객체를 필요한 곳에 알아서 넣어준다 (DI)

<예시>

커피숍
new -> 클라이언트가 요청시마다 new를 하면 비용적으로 매우 손실이 크다
@Component
@ComponentScan으로 미리 모두 다 준비해놓고, 필요하면 준비된 객체를 제공 한다

스프링 IOC 컨테이너가 관리
ComponentScan으로 Bean/Component를 찾아서 객체를 생성

생성한 객체를 필요한 곳에 알아서 넣어준다 DI

@Bean
@Component
어노테이션을 붙이면
Spring IoC 컨테이너가 자동으로 해당 객체를 생성한다
해당 객체를 필요로 하는 다른 객체에 주입 시켜준다 DI


우리는 단 한번도 new(생성자)를 써서 객체를 만들지 않았다 = 제어의 역전 (IoC) - 프레임워크가 컨트롤한다


여러번 생성할 필요가 없는 객체는 스프링이 싱글톤처럼 관리한다

<예제>

1. 프로젝트 생성

2. 다운로드 후 압축풀기

3. locahost 변경 (JSP 톰캣 서버를 사용하고 있기 때문에 변경 : 기본은 8080)

4. 웹사이트에서 locahost:60606 입력후 검색하면 밑의 화면이 나옴

  1. 라이브러리 추가 : build.gradle

<커피숍 생성 예제>

  1. 커피숍, 직원, 커피, 커피말아주는 직원 클래스 생성

<Coffee.java>

package com.example.grazie;

import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.stereotype.Component;


@Data
// 커피이름을 받는 생성자 생성  = @AllArgsConstructor
@AllArgsConstructor
public class Coffee {
    private String name;
}

<CoffeeService.java>

package com.example.grazie;

import org.springframework.stereotype.Service;

@Service
// 커피 말아주는 직원 -> 아메리카노, 카푸치노, 아샷추만 만들수 있음
public class CoffeeService {
    public Coffee 아메리카노(){
        return new Coffee("아메리카노");
    }
    public Coffee 카푸치노(){
        return new Coffee("카푸치노");
    }
    public Coffee 아샷추(){
        return new Coffee("아샷추");
    }
}

<CoffeeController.java>

package com.example.grazie;

import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

//카운터직원
@RestController
@RequiredArgsConstructor
public class CoffeeCotroller {
    private final CoffeeService coffeeService;

//    @RequiredArgsConstructor 와 밑의 생성자 만드는것과 동일
//    public CoffeeCotroller(CoffeeService coffeeService) {
//        this.coffeeService = coffeeService;
//    }

    //     @GetMapping("/아메리카노") = 고객이 요청하는 내용
    @GetMapping("/아메리카노")
    public Coffee 아메리카노(){
        return coffeeService.아메리카노();
    }
    @GetMapping("/카푸치노")
    public Coffee 카푸치노(){
        return coffeeService.카푸치노();
    }
    @GetMapping("/아샷추")
    public Coffee 아샷추(){
        return coffeeService.아샷추();
    }
}
profile
풀스택 개발 이야기

0개의 댓글