7월 5주차 WIL_03

Jobmania·2022년 7월 31일
0

항해 과정 기록

목록 보기
3/19
post-thumbnail

이번주에 대한 반성 : 이론을 찾아봐서 적지만 나한테 쌓이기 위해선 여러번 봐야될 것 같다. 또한 실습활동도 마찬가지다... 이전 작업물들을 꾸준히 리와인드하자..

이번주의 키워드 : DI, IoC, Bean

이것부터 정리하고 가자

1. DI(Dependency Injection, 의존성 주입)

강한결합의 문제점!! 이를 느슨한 결합으로 바꾸기 위해...

프로그래밍에서 구성요소 간의 의존 관계가 소스코드 내부가 아닌 외부의 설정파일을 통해 정의되는 방식

왼쪽은 A에서 B를 생성하는 일반적인 의존 형태이고, 오른쪽은 외부에서 의존 객체를 생성하고 주입하는 형태입니다.

의존성 주입으로 얻는 장점

  1. 객체 상호간의 의존성을 줄여줌.
  2. 코드의 재사용을 및 조합이 용이.
  3. 코드의 분리로 가독성 상승.
  4. 구조 변화에 민감하지 않게됨.
  5. 테스트 용이

의존성 주입 방식

  1. 필드(field) 주입
  2. 세테(Setter) 주입
  3. 생성자(Constructor) 주입
    Spring 4.3이후 생성자 주입을 권장한다고 함.

생성자 주입 방식 예시

@Controller
public class UserService{
	private final UserRepository userRepository;
   
   @Autowired // 하나인 경우 생략가능!
   public UserService(UserRepository userRepository){
   this.userRepository = userRepository;
   }
}
  • 쉽게 말하자면 게임 캐릭터라는 하나의 객체가 존재하는데, 그 객체를 더 잘 이용하기 위해서 무기, 방패 등 아이템을 가져와 결합시키는 것이다. 이 객체는 무기와 방패를 뺐다 꼈다 자유자재로 할 수 있으며 아이템을 갈아끼우는데 어떤 상황에 구애받지도 않는다.

  • JAVA에서 데이터를 저장하고 가져오는 기능을 외부의 Oracle Database를 사용할 수도 있고, JDBC, iBatis, JPA 등 다른 프레임 워크를 이용해 짤 수도 있다. 이때 Spring을 이용하면 그때마다 필요한 부분을 뺐다 꼈다 하면서 적절한 상황에 필요한 기능을 해낼 수 있다.

DI 는 IoC 를 구현하는 방법 중 한 가지 방법이다.

https://faith-developer.tistory.com/147
https://blog.naver.com/PostView.nhn?blogId=dktmrorl&logNo=222116844258&redirect=Dlog&widgetTypeCall=true&directAccess=false
https://tecoble.techcourse.co.kr/post/2021-04-27-dependency-injection/

2. IOC(Inversion of Control, 제어 반전)

  • 개발자는 JAVA 코딩시 new 연산자, 인터페이스 호출, 데이터 클래스 호출 방식으로 객체를 생성하고 소멸시킨다.

  • IoC란 인스턴스 (객체)의 생성부터 소멸까지 객체 생명주기 관리를 개발자가 하는게 아닌 스피링(컨테이너)가 대신 해주는 것을 말한다.

  • IoC는 개발자가 실수할 수 있는 생명주기 관리를 대신 해준다.

  • 프로젝트의 규모가 커질수록 객체와 자원을 이용하는 방법이 더 복잡해지고 어디서 코드가 꼬일지 모르는 것을 Spring의 IoC는 자동으로 관리해준다.

  • 즉, 제어권이 개발자가 아닌 IoC에게 있으며 IoC가 개발자의 코드를 호출하여 그 코드로 생명주기를 제어하는 것이다.

https://dev-coco.tistory.com/80

IOC정리

구현 객체는 자신의 비즈니스 로직을 실행하는 역할만 담당.
즉, 이전은 구현객체가 스스로 필요한 구현 객체를 생성하고 연결하고 생성했다면, 제어흐름을 외부에서 관리하여 외부에서 객체를 생성해서 실행하는 것
/* -
예시) 예를 들어 A 객체에서 B 객체에 있는 메소드를 사용하고 싶으면, B 객체를 직접 A 객체 내에서 생성하고 메소드를 호출합니다.
하지만 IOC가 적용된 경우, 객체의 생성을 특별한 관리 위임 주체에게 맡깁니다. 이 경우 사용자는 객체를 직접 생성하지 않고, 객체의 생명주기를 컨트롤하는 주체는 다른 주체가 됩니다. 즉, 사용자의 제어권을 다른 주체에게 넘기는 것을 IOC(제어의 역전) 라고 합니다.
추가적으로 프레임워크가 요구하는대로 객체를 생성하면, 프레임워크가 해당 객체들을 가져다가 생성하고, 메서드를 호출하고, 소멸시킨다. 프로그램의 제어권이 역전

DI 정리

의존을 구현이 아닌 추상(역할)에 한다. 애플리케이션 실행 시점(런타임)에 객체에 대한 주입을 외부에서 생성하는 것.

IOC 사용하면 좋은점

프로그램의 진행 흐름과 구체적인 구현을 분리시킬 수 있다.
개발자는 비즈니스 로직에 집중할 수 있다
구현체 사이의 변경이 용이하다.
객체 간 의존성이 낮아진다.

DI를 사용하면 좋은점

의존성이 줄어든다. (변경에 덜 취약해진다.)
모의 객체를 주입할 수 있기 때문에 단위 테스트가 쉬워진다.
가독성이 높아진다.
재사용성이 높아진다.

3. Bean

빈이란? 스프링 컨테이너가 관리하는 객체
스프링 컨테이너란? 빈을 관리하는 객체

스프링 IoC가 관리하는 객체라함은 스프링에 의해 생성되고, 라이프 사이클을 수행하고, 의존성 주입이 일어나는 객체들을 말한다.

즉, 개발자가 관리하는 객체가 아닌 스프링에게 제어권을 넘긴 객체를 스프링에서 Bean이라고 부른다.

Bean을 등록하는 방법에는

  • xml에 등록하는 방법

  • @Bean 애노테이션을 이용하는 방법

  • @Component 애노테이션을 이용하는 방법

    그렇다면 Bean과 Component의 차이점은??

@Bean : 메소드 레벨에서 선언하며, 반환되는 객체(인스턴스)를 개발자가 수동으로 빈으로 등록하는 애노테이션

@Compenet : 클래스 레벨에서 선언함으로써 스프링이 런타임시에 컴포넌트스캔을 하여 자동으로 빈을 찾고(detect) 등록하는 애노테이션

개발자가 컨트롤이 불가능한 외부 라이브러리를 빈으로 등록하고 싶을때 @Bean을 사용하며, 개발자가 직접 컨트롤이 가능한 클래스의 경우 @Component를 사용한다고 한다.

https://youngjinmo.github.io/2021/06/bean-component/
https://jerryjerryjerry.tistory.com/62

++ 스프링 IOC컨테이너는 빈을 어떻게 관리하는가?
https://www.youtube.com/watch?v=3gURJvJw_T4


22.07.25

스프링봄 4강 1

기본기 숙달 : 3계층(Controller, Service, Repository) 숙달과 API handling은 무엇보다 중요한 기본기

주소 규칙 ? 뒤에는 내가 같이 가지고 가는 녀석들이다.
주소 규칙 & 뒤에는 정렬 규칙등 오름차순,날짜순


복습
Repo사용방법
findby변수and변수 >> 둘다찾아라


실전프로젝트

  • 중요한것은 기술적난이도 및 완성

Controlle는 최대한 깔끔하게, 최소한 코드 구현

Service에서 최대한 메소드 구현



220726

스프링봄 4-3강

주소 규칙 ? 뒤에는 내가 같이 가지고 가는 녀석들이다.
주소 규칙 & 는 and 의미, 검색조건을 뒤에 붙인다.


항해톡

  • OSI 7계층 ;
    *프로세스 vs 스레드
  • DB INDEX
  • N NP NPC

JPA, 영속성 책에 대한 추천

https://book.interpark.com/product/BookDisplay.do?_method=detail&sc.prdNo=240925953&gclid=Cj0KCQjwof6WBhD4ARIsAOi65ajIJYa3ZWluhREXg6W8sdQQ7nahhbVQ0ktah_F65FYbkI7SnsZqW8IaAt8WEALw_wcB

압축한내용 https://ultrakain.gitbooks.io/jpa/content/chapter1/chapter1.html


Getter 한번더 정리
private한 클래스나 변수를 외부 클래스에서 조회하려면 Getter를


db index 간단한 정리 !!
https://velog.io/@ljinsk3/JPA로-인덱스-사용하기

메모리 내용...
key / value
id / 주소

pk = primary key


  • @exceptionHandler 예외처리

22.07.27

mapping에 대한 사용방법
https://cpdev.tistory.com/133

스프링 빈에 대해서
https://www.youtube.com/watch?v=3gURJvJw_T4


스프링봄 4.6강

@MappedSuperclass // 상속한 클래스에 멤버 변수가 컬럼이 되도록 합니다.

private final ProductRepository productRepository;
// RestController에게 이녀석은 꼭 필요한 녀석인 것을 알려줌 .
@RequiredArgsConstructor
// final로 선언된 멤버 변수를 자동으로 생성합니다


스프링봄 4.9강

@Component // 라고 등록하면 Service나 Entity처럼 스프링이 권한획득.

BEAN VS COMPONENET 차이에 대해서
BEAN 내가 관리하는거다 > 외부
COMPONENET > 내부

BEAN 객체 1개만 존재,

git bash jpa 다운업그레이드
sudo apt-get install openjdk-11-jdk
sudo apt-get install openjdk-8-jdk

  • 디버그
    알고리즘 풀때 하나씩 실행해서 좋은 거 같다.]

220728

과제제출

  1. 수정, 삭제 API의 request를 어떤 방식으로 사용하셨나요? (param, query, body)
    https://medium.com/@bouncewind0105/request-param-query-body-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90-2e7e4fddd8b9
    https://velog.io/@leyuri/TILRequest-paramquery-body-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90
  • body를 사용해서 JSON 방식으로
  1. req.param
    주소에 포함된 변수를 담는다. 예를 들어 https://naver.com/post/12345 라는 주소가 있다면 12345를 담는다. 서버에서 Path Variable 로 칭한다.
    /// 여기서 각각의 id값으로 변수를 담아 api를 컨트롤 하였다.

  2. req.query
    주소 바깥, ? 이후의 변수를 담는다. 예를 들어 https://naver.com/post?query=아디다스 일 경우 아디다스를 담는다. &을 연결하여 여러개의 데이터를 넘길 수 있다.
    서버에서는 Query parameter라고 한다.

  1. req.body
    XML, JSON, Multi Form 등의 데이터를 담는다. 여기서 우리는 title, author등등 해당 데이터를 ARC를 이용해 body값들을 입력, 들고 올때도 json형식으로 DATA를 이동하여 담았다. 그래서 body형식이라고 생각한다.

  1. 어떤 상황에 어떤 방식의 request를 써야하나요?
    제생각은 param 같은 방식은 id와 같이 식별가능한 변수를 활용해야할 때 적절하다고 생각하며, query는 &를 통해 여러가지 정보를 담아 여러기능을 구현할 수 있기 때문에 (ex 최저가 정렬, 최신정렬) 예시방식을 사용할 때 활용하면 될 것같습니다.
    body방식은 @Request body의 Body에 기록된 많은 변수를 사용자가 뽑아 사용할 때 적절하다고 생각한다.

https://inpa.tistory.com/entry/EXPRESS-%F0%9F%93%9A-reqparams-reqquery-reqbody-%F0%9F%A4%94-%EC%A0%95%EB%A6%AC


  1. RESTful한 API를 설계했나요? 어떤 부분이 그런가요? 어떤 부분이 그렇지 않나요?
    RESTful 기준이
    1.Server-Client(서버-클라이언트 구조)
    원이 있는 쪽이 Server, 자원을 요청하는 쪽이 Client가 되며, 서로간의 의존성이 낮다.
    2.Stateless(무상태) : 클라이언트-서버 커뮤니케이션: 요청 간에 클라이언트 정보가 저장되지 않으며, 각 요청이 분리되어 있고 서로 연결되어 있지 않음
    3.Cacheable(캐시 처리 가능) : 클라이언트-서버 상호 작용을 간소화하는 캐시 가능 데이터
    4.Layered System(계층화) : Client는 REST API Server만 호출한다.
    등이 있는데

우선은 CRUD기능을 충족을하며 서버의 Data가 나에게 저장되지 않기 때문에 1,2번은 충족하며 아직 3번은 활용하지 못해서 충족하지 못했다고 생각한다. 현재 기능구 현 api들은 4번을 충족했다고 생각한다.

https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html
https://www.redhat.com/ko/topics/api/what-is-a-rest-api


  1. 적절한 관심사 분리를 적용하였나요? (Controller, Repository, Service)
    Controller란 클라이언트의 요청 받고 및 응답을 하는 역할이며 받은 요청에 따라 Service에게 변수, 메소드를 활용하게 하며 이후 DB정보들을 Repository에게 주면, DB의 CRUD작업을 처리한다

DTO를 여러개 만들어 원하는 데이터를 뽑고 처리하는데

https://velog.io/@jybin96/Controller-Service-Repository-%EA%B0%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C
https://velog.io/@sezeom/Controller-Service-Repository-%EB%B6%84%EB%A6%AC-%EC%9D%B4%EC%9C%A0


  1. 작성한 코드에서 빈(Bean)을 모두 찾아보세요!
    Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라는 용어로 부른다.
    Spring에 의하여 생성되고 관리되는 자바 객체를 Bean이라고함 .
    우리가 new 연산자로 어떤 객체를 생성했을 때 그 객체는 빈이 아니다.

Controller ,Service, Repository, << 이 빈에 해당 된다고 생각합니다.

https://melonicedlatte.com/2021/07/11/232800.html
https://youngjinmo.github.io/2021/06/bean-component/


스프링 심화과정 1강

  1. 우선 api 먼저 설계를 시작한다.

참고 . 스프링봄 4강 14. 스케줄러 만들기

cron = 정해진 시간에 실행되도록.
src > main > java > com.sparta.week04 > utils 에 Scheduler.java 생성

@RequiredArgsConstructor // final 멤버 변수를 자동으로 생성합니다.
@Component // 스프링이 필요 시 자동으로 생성하는 클래스 목록에 추가합니다.
public class Scheduler {

private final ProductRepository productRepository;
private final ProductService productService;
private final NaverShopSearch naverShopSearch;

// 초, 분, 시, 일, 월, 주 순서
@Scheduled(cron = "0 0 1 * * *")
public void updatePrice() throws InterruptedException {
    System.out.println("가격 업데이트 실행");
    // 저장된 모든 관심상품을 조회합니다.
    List<Product> productList = productRepository.findAll();
    for (int i=0; i<productList.size(); i++) {
        // 1초에 한 상품 씩 조회합니다 (Naver 제한)
        TimeUnit.SECONDS.sleep(1);
        // i 번째 관심 상품을 꺼냅니다.
        Product p = productList.get(i);
        // i 번째 관심 상품의 제목으로 검색을 실행합니다.
        String title = p.getTitle();
        String resultString = naverShopSearch.search(title);
        // i 번째 관심 상품의 검색 결과 목록 중에서 첫 번째 결과를 꺼냅니다.
        List<ItemDto> itemDtoList = naverShopSearch.fromJSONtoItems(resultString);
        ItemDto itemDto = itemDtoList.get(0);
        // i 번째 관심 상품 정보를 업데이트합니다.
        Long id = p.getId();
        productService.updateBySearch(id, itemDto);
    }
}

}

서비스에서 생성
@RequiredArgsConstructor // final로 선언된 멤버 변수를 자동으로 생성합니다.
@Service // 서비스임을 선언합니다.
public class ProductService {

@Transactional // 메소드 동작이 SQL 쿼리문임을 선언합니다.
public Long updateBySearch(Long id, ItemDto itemDto) {
    Product product = productRepository.findById(id).orElseThrow(
            () -> new NullPointerException("해당 아이디가 존재하지 않습니다.")
    );
    product.updateByItemDto(itemDto);
    return id;
}

}

이후 객체에 업데이트를 한다


스프링 심화 1.7강 Controller 사용이유 !

Survelt에서 중복내용을 Spring에서 해줌 .

JSP를 쓰면 Survlet을 쓸 수 밖에 없다..


람다식 Functional 함수형 프로그래밍 ..
https://mangkyu.tistory.com/111


220729

심화과제 발제 내용 정리 :
코드를 왜 그렇게 짰는지 물어봄.. 나름의 이유를 붙이자 ..

학습자료 다보기 !!
입문 : https://teamsparta.notion.site/Spring-c3d20a4a553448c5871bfd3e4f370111

입문자료 답변을 봤는데 신기하게 씀..
자바 타입 제네릭
https://seeminglyjs.tistory.com/184

Service 및 Response Dto를 잘봐야겟슴.

  • application,properties에서 server.port=8081 처럼 서버포트 변경가능.

스프링 심화 1-3강


스프링 심화 1-6강

Survlet을 이용해 Controller 없이 서버 구현.

스프링 심화 1-7강

Controller를 사용하면 좋은점
1.json형식 변환 및 타입을 해준다.
2. api 이름마다 파일을 만들 필요가 없다. 예시api로 survlet 3개가 필요한대
3. 함수 이름을 내맘대


스프링 심화 1-8강

스프링 MVC에 이해
Model, View, Controller

Http 메시지에 대한 이해
https://developer.mozilla.org/ko/docs/Web/HTTP/Messages
1. Request

  • 시작줄(Start Line): API 요청 내용,
  • Header : Content type > 에 대한 내용 (ex, form 형식, ajax)
  • Body : GET 요청 시: (보통) 없음, POST 요청 시: (보통) 사용자가 입력한 폼 데이터
  1. Response
  • 상태줄: API 요청 결과 (상태 코드, 상태 텍스트)
    상태코드란? 어떻게 처리했는지 결과를 나타냄.. 404 -> not found
    http 404 상태코드 검색 (위키백과)
  • Heaer :
    Content type : [ 1. 없거나 2. 본문내용이 html경우 3. 본문내용이 json일 경우.]
    Location : Redirect할 페이지
  • Body : 본문(content type에 따라 html, json)

정적웹페이지
++ Redirect 내용 : redirect에서 path를 써서 이동시켜주면된다.
++ 타임리프 설정 : 스트링 값으로 반환했는데 html로 넘어간다!신기
++ Responsebody(view를 통과하지않음) : 여기 스트링 내용을 body에 넣어줘라.

동적웹페이지
View 정보, Model 정보를 타임리프에게 전달..
Content Type을 text(html), json등 잘 맞춰서 프론트엔드개발자와 소통해야한다.

Response의 변화
정적 -> 동적 -> 제이슨 형태도 주고받을수 있게 (최신)
(최신)참고: 싱글페이지 애플리케이션 (SPA, Single Page Application)

@RestController = @Controller + @ResponseBody


금일 세션 주제
1. SQL vs NoSQL
2. DB 연관관계 및 ERD
3. DB Index 의 개념 및 중요성 이해

백엔드개발자는 서버를 아주 잘 이해해야한다..


220730

스프링 심화 1-9장

View: 동적 HTML 파일
Model: View 에 적용할 정보들

요즘 대세 SPA란?

!!Spring MVC 공식 문서
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc


220731


스프링 심화

인증과 인가 차이 구분하기
인증 : 출입권한
인가 : 접근권한

Enum (열거형) : 특정한 값만 한정하여, 사용하고 싶다. (ex 남자여자)
https://school.programmers.co.kr/learn/courses/5/lessons/423

profile
HelloWorld에서 RealWorld로

0개의 댓글