* 일단 그동안 항해를 수료하신 기술 매니저님들의 조언을 정리해 보자.


[ 김가은 매니저님 ]

- 코딩 테스트는 프로그래머스 Lv1 - Lv2 정도로 준비, 하루에 하나씩 꾸준히 ! 

- 너무 알고리즘 한 문제에 오랜 시간을 투자하지 말고 적정 시간 지나면 답안 체크하고 쓰인 메소드 확인하기.

- 프로그래머스 다른사람 풀이 체크 하기

- 주특기 주차에 잘 숙지를 해야 실전을 잘 보낼 수 있다.

- 과제 순서 : 강의 자료 코드스니팻 붙여서 구현 -> 이해안되는 코드 공부 -> 리팩토링

- 자료구조 공부 : List, Map, Stream(스트림은 현업에 많이 쓰이지만 당장 우선순위는 아님)

- 코딩하면서 브레이크 포인트 잡고 디버깅 하면서 오류나 값 확인 하기.

- 강의자료는 금요일까지만 공부를 끝내고 바로 과제 구현하면서 추가 공부하기.

- 깃허브에 과제용 레포 만들어서 commit/ push 연습하기 ( 소스트리보다 터미널 사용 권장 )

 

[ 김민지 매니저님 ]

- SQL 문법 공부는 해야함 : 유튜브 찾아볼 것 ! 노마드코더 SQL, 얄코 SQL  // 쿼리문이 중요함 !! 백엔드의 숙명 !!

- 인프런 강의는 숙련주차 끝나고 개념정리식으로 듣기 

- 프로젝트 기획은 꿈을 크게 갖고 정하자. 그리고 안되는건 쳐내는 식으로 ! 

- 공공 API 가게 정보들 조회할 때 등 유용하게 쓰일 수 있음

- 실시간 채팅 기술은 노드, 크롤링은 자바가 주로 맡게 되는데, 스케줄링 이라는 기술로 스탬프 찍는 것을 구현할 수도 있다.

- 원티드나 로켓펀치, 점핏, 링크드인 등을 참고해서 내세울 수 있는 main 기술 꼭 쓰기 (자격조건, 우대조건 체크)

- 취업은 운빨이다. (블로그를 열심히 쓰자 ) 디자인이 예쁘면 작은 기술도 커버가 된다.

- 리드미작성도 많이 본다. 어떤 기술을 썼고, 어떤 개고생을 했는지 잘 기입하기: ) 

- 매주 지난 주차와 다른 점을 비교하면서 공부해 볼 것.

- 카카오톡 로그인 실전때 꼭 구현해 보기! 

-  query DSL 협업에 많이 쓰이니까 나중에 공부해 보기 (실전에 사용해도 되고 안해도 괜찮)

 

 

[ 김용빈 매니저님 ]

- 코딩은 계단식 성장을 한다. 지금 정체되어 있는 것 같아도 꼭 올라가는 지점이 온다.

- 코딩테스트는 수능이라 생각하고 공부하자.

- 수료를 하기까지 수많은 시련이 온다. 살아남는 사람이 이기는 우승이라 생각하자.

- 지금 이 힘든 시간들이 다 주니어로써 역량을 갖추는 과정이고, 노력하면 취업은 무조건 하게 되어있다.

- 인프런 김영한 선생님 강의를 추천해 주심

- 매 주마다의 고민으로 성장 history 를 만드는게 중요! ( 블로그 정리 필수 !)

- 복붙하는 블로그가 아니라 나의 생각을 정리하는 블로그를 만들기

 

 

[ 김범규 대표님 조언 ]

- 실전때 쓰면 좋을 기술들 : 화상채팅, 다국어처리 (동시선 제어), 실시간 채팅

- 개발을 좋아하는 사람이라고 어필하기. = 평소에 호기심을 갖고 공부하자.

- 스스로 개발을 사랑한다고 세뇌시키기.

- 성격, 성향, 말투, 자신감, 세련됨이 중요하다. 평소에 세련되게 말하는 연습을 하자.

- 삽질하는 시간이 필요하다. 프로젝트 하면서 안되는 기술 깊게 파보기.

- 채용이 되는 사람 : 스스로 문제를 파고들 줄 아는 사람, 같이 일하고 싶은 사람.

 

 

[ 강준규 매니저님 ]

- 개발을 하기 전에 클라이언트에서의 키값과 서버단에서의 필드 값이 일치하는지 먼저 확인

- Spring 필요한 라이브러리 세팅하고

- Entiry - Dto - Repository - Controller - Service 순서로 만들기

 

[ 황창환 매니저님 - 디버깅 세션 ] 

- 질문 하는 법 : stackoverflow.com 이용. 깃허브, 항해 질문방, 동료들한테 물어보기 (잘하는 사람 빼먹기 ...^^) 질문을 잘 해야 한다! 

- 에러를 대처하는 법 : console창 활용, 코드에 주석달아서 흐름 이해하기, 구글링, 트러블 슈팅은 블로그로 정리, 크롬창의 Network 부분 잘 활용하기.

 


< 공부해야할 부분 >

 

Solid, JPA ( 면접때 많이 물어봄, 많이 공부해 놓기)

  • Spring 공부 - JPA 공부 (이친구가 자바코드를 쿼리문으로 바꿔서 SQL 언어로 변환한 뒤 DB에 알려주는 것) - 데이터베이스공부.

CS면접 - 구글링

JWT / Spring Security 

show - sql

ddl-auto

예외처리 로그

의존성주입, @Bean, 의존성

  • Bean에 대해 잠시 적어보자면, @어노테이션 콩을 하나하나 커피통에 넣어주고 필요한 곳에 알아서 꺼내준다고 생각하면 된다.
  • 알아서 어노테이션들을 관리해 주는 것 ! 

DTO 생성자 쓰는 방법 : new 연산자, 정적 메서드, Setter, builder

매주 화/수 요일쯤 코드리뷰 해보기 : 메소드 이름과 위치도 신경써서 보자

오버로딩 (생성자 매개변수 관련) / 오버라이딩 

두 가지 트랜잭션 

DTO는 프론트엔드랑 잘 소통을 해야한다. 

  • API 별로 따로 만들 것인지 아니면 공통드로 만들 것인지
  • 더 큰 데이터로 만들 것인지 (꺼내 쓸 수 있독록)
  • Response 값을 어떻게 줄 것인지. (상황 따라 다름)
  • inner class -> controller 단에 만드는 방법

 

STEP 1 (다대일 단방향)

책 : 서점 = N : 1 이라고 가정하고 제출한 답안

package com.example.spring_week_2_test.entity;

import com.example.spring_week_2_test.dto.BookRequestDto;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@Getter
@NoArgsConstructor
@Table(name = "Book") //테이블명 선언
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "book_id") //PK설정
    private Long id;

    @Column(nullable = false)
    private String author;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private int price;

    @Column(nullable = false)
    private Long quantity;

    @ManyToOne
    @JoinColumn(name = "book_store_id", nullable = false)
    private BookStore bookStore; //FK는 book_store_id 가 된다.


}
package com.example.spring_week_2_test.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@Getter
@NoArgsConstructor
@Table(name = "BookStore")
public class BookStore {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "book_store_id")
    private Long id;

    @Column(nullable = false)
    private String location;

    @Column(nullable = false)
    private String name;
}

 

STEP2 ( 다대일 양방향 )

 

책 : 서점 = N : 1 이라고 가정하고 제출한 답안

package com.example.spring_week_2_test.entity;

import com.example.spring_week_2_test.dto.BookRequestDto;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@Getter
@NoArgsConstructor
@Table(name = "Book")
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "book_id")
    private Long id;

    @Column(nullable = false)
    private String author;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private int price;

    @Column(nullable = false)
    private Long quantity;

    @ManyToOne
    @JoinColumn(name = "book_store_id", nullable = false)
    private BookStore bookStore;

}

 

package com.example.spring_week_2_test.entity;

import com.example.spring_week_2_test.dto.BookStoreRequestDto;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
@NoArgsConstructor
@Table(name = "BookStore")
public class BookStore {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "book_store_id")
    private Long id;

    @Column(nullable = false)
    private String location;

    @Column(nullable = false)
    private String name;

    @OneToMany(mappedBy = "bookStore")
    private List<Book> bookList = new ArrayList<>();

}

 

STEP3. 일대다 단방향 연관관계

 

 

책 : 회원 = N : 1 이라고 가정하고 제출한 답안

package com.example.spring_week_2_test.entity;

import com.example.spring_week_2_test.dto.BookStoreRequestDto;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
@NoArgsConstructor
@Table(name = "BookStore")
public class BookStore {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "book_store_id")
    private Long id;

    @Column(nullable = false)
    private String location;

    @Column(nullable = false)
    private String name;

    @OneToMany(mappedBy = "bookStore")
    private List<Book> bookList = new ArrayList<>();

    @OneToMany
    @JoinColumn(name = "book_store_id")
    private List<Member> memberList = new ArrayList<>();

}
package com.example.spring_week_2_test.entity;

import jakarta.persistence.*;

@Entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "Member")
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "member_id")
    private Long id;

    @Column(nullable = false)
    private String address;

    @Column(nullable = false)
    private String email;

    @Column(nullable = false)
    private String nickname;

    @Column(nullable = false)
    private String password;

    @Column(nullable = false)
    private String phoneNumber;
}

 

 

STEP4. 구매(Purchase) Entity를 사용해서 (Member)과 책(Book)의 연관관계를 맺어보세요!

구매 : 회원 = N : 1

구매 : 책 = N : 1

이라고 가정하여 작성한 답안.

 

구매와 책 관계가 헷갈렸는데, 코드를 생각해보면 해당 책에 대한 코드는 하나일 것이고, 그 책에 대한 구매가 여러번 발생할 것으로 생각하면 이해가 조금 쉽다 ! 

package com.example.spring_week_2_test.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
@NoArgsConstructor
@Table(name = "Purchase")
public class Purchase {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "purchase_id")
    private Long id;

    @ManyToOne
    @JoinColumn(name = "member_id")
    private Member member;

    @ManyToOne
    @JoinColumn(name = "book_id")
    private Book book;

}
package com.example.spring_week_2_test.entity;

import com.example.spring_week_2_test.dto.BookRequestDto;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
@NoArgsConstructor
@Table(name = "Book")
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "book_id")
    private Long id;

    @Column(nullable = false)
    private String author;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private int price;

    @Column(nullable = false)
    private long quantity;

    @ManyToOne
    @JoinColumn(name = "book_store_id", nullable = false)
    private BookStore bookStore;

    @OneToMany(mappedBy = "book")
    private List<Purchase> purchases = new ArrayList<>();
}
package com.example.spring_week_2_test.entity;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "Member")
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "member_id")
    private Long id;

    @Column(nullable = false)
    private String address;

    @Column(nullable = false)
    private String email;

    @Column(nullable = false)
    private String nickname;

    @Column(nullable = false)
    private String password;

    @Column(nullable = false)
    private String phoneNumber;

    @OneToMany(mappedBy = "member")
    private List<Purchase> purchaseList = new ArrayList<>();

}

 

스텝 4 까지 했을 때 ERD

 

답안과 같은 양식인 것을 확인하고 제출 !

 

 

 

틀린 부분

1. Book Entity의 quantity 타입을 long 으로 했어야 하는데 Long 으로 작성했다.

2. STEP4 Purchase 부분 지연로딩 (fetch = FetchType.LAZY) 추가

 

package com.example.spring_week_2_test.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
@NoArgsConstructor
@Table(name = "Purchase")
public class Purchase {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "purchase_id")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY) //(fetch = FetchType.LAZY) 추가
    @JoinColumn(name = "member_id") 
    private Member member;

    @ManyToOne(fetch = FetchType.LAZY) //(fetch = FetchType.LAZY) 추가
    @JoinColumn(name = "book_id") 
    private Book book;

}

참고 자료 : 

 

 

[JPA] 다양한 연관관계 매핑 (1) 다대일, 일대다

엔티티의 연관관계를 매핑할 때는 3가지를 고려해야한다. 다중성 단방향, 양방향 연관관계의 주인 먼저 두 엔티티가 일대일 관계일지 일대다 관계인지 다중성을 고려한다. 다음으로, 두 엔티티

jgrammer.tistory.com

'Coding > Spring' 카테고리의 다른 글

[24] ERD(Entity Relationship Diagram)  (0) 2022.12.13
[23] Spring Security  (0) 2022.12.13
[21] ORM, JPA, Spring Data JPA  (0) 2022.12.08
[20] 의존성 주입 DI(Dependency Injection)  (0) 2022.12.08
[19] 스프링 프레임워크  (0) 2022.12.08

ORM, JPA, Spring Data JPA 

  • ORM : 객체(Object)와 관계형 데이터(Relational data) 를 매핑하기 위한 기술이다. 객체와 테이블 관계를 바탕으로 SQL문장을 자동으로 생성하여 객체로 DB를 조작하게 하는 기술.
  • JPA : 자바 ORM 기술에 대한 API 표준 명세이다. ORM을 사용하는 방식을 정의한 인터페이스를 모아둔 것. JPA는 특정 기능을 하는 라이브러리가 아니며, 말그대로 인터페이스이다. 따라서 사용방식에 대해서만 정의했을 뿐 구현이 없다.
  • Hibernate : JPA라는 명세의 구현체. 즉, JPA 인터페이스를 구현한 라이브러리 중 하나로 현 프레임워크 중 가장 주도 하고 있다.
  • Spring Data JPA : Spring Data JPA는 JPA를 쓰기 편하게 만들어놓은 모듈이다. JPA를 한 단계 추상화시킨 Repository라는 인터페이스를 제공함으로써 JPA를 사용할 때 예상가능하고 반복적인 코드들을 대신 작성해주어 코드를 줄일 수 있도록 해준다.  

 

 ORM

  ORM 이란 Object-Relational Mapping 의 약자로, 이름 그대로 객체(Object)와 관계형 데이터(Relational data) 를 매핑하기 위한 기술이다. 즉, 내가 코드 상에서 생성한 객체가 DB상에 어떤 테이블과 연결이 된다는 것을 의미한다. 이러한 매핑이 필요한 이유는 객체 지향 언어과 관계형 데이터베이스사이의 패러다임 불일치가 있기때문이다.  이 둘 간의 패러다임 불일치 때문에 개발자는 더 많은 코드를 작성해야 하며, 이는 반복적이고 실수하기 쉬운 작업이 된다. 그렇기 때문에 개발자는 객체지향적인 설계에 집중할 수 없게 된다. ORM이 바로 이러한 문제를 해결해 준다. 

 

https://medium.com/@emccul13/object-relational-mapping-9d84807f5536

 

 패러다임 불일치

객체 지향 프로그래밍과 관계형 데이터베이스 사이의 데이터 표현 방식이 달라서 생기는 문제를 패러다임 불일치라고 한다. 패러다임 불일치가 일어나는 이유는 애초에 이들의 목표와 동작 방식이 다르기 때문이다.

  • 객체 지향
    • 필드와 메서드 등을 묶어서 객체로 잘 만들어 사용하는 것이 목표
    • 객체 지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공한다.
  • 관계형 데이터베이스
    • 데이터를 잘 정규화해서 보관하는 것이 목표

 

 

JPA

  JPA는 Java Persistence API의 약자로, 자바 ORM 기술에 대한 API 표준 명세이다. 즉, 인터페이스의 모음이다. 이러한 JPA 인터페이스를 구현한 대표적인 프레임워크가 하이버네이트(Hibernate)이다.JPA는 애플리케이션과 JDBC 사이에서 동작한다. 개발자가 JPA를 사용하면, JPA 내부에서 JDBC API를 사용하여 SQL을 호출하여 DB와 통신한다. 즉, 개발자가 직접 JDBC API를 쓸 필요가 없다.

 

 

 Hibernate

    JPA를 구현한 프레임워크 중 사실상 표준이다. 오픈소스 소프트웨어이다. 여기서 주목해야할 점은 JPA 기술 스펙이고 하이버네이트는  기능을 구현하여 공급해주는 역할이다.

 

Spring Data JPA

 Spring framework에서 JPA를 편리하게 사용할 수 있도록 지원하는 프로젝트(모듈)이다. Spring Data JPA의 목적은 JPA를 사용할 때 필수적으로 생성해야하나, 예상가능하고 반복적인 코드들을 대신 작성해줘서 코드를 줄여주는 것이다. 이는 JPA를 한 단계 추상화시킨 Repository라는 인터페이스를 제공함으로써 이루어진다.

 Spring Data JPA는 JPA Provider이 아니다. 단지 데이터 계층에 접근하기 위해 필요한 뻔한 코드들의 사용을 줄여주도록 하는 인터페이스이다. 여기서 반드시 기억해야할 점은 Spring Data JPA 항상 하이버네이트와 같은 JPA provider 필요하다는 것이다.

 

 

출처 : 스프링부트와 aws로 혼자 구현하는 웹서비스(이동욱 저)

 

 

 

 

 

참고 자료 : https://doing7.tistory.com/105

스프링에서 DI (의존성 주입) 를 사용하는 이유

 

① DI(의존성 주입)이란?

  • DI란 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴으로, 인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 다이나믹하게 주입하여 유연성을 확보하고 결합도를 낮출 수 있게 해준다.
  • 즉, 객체간의 의존성을 스프링 컨테이너(Spring Container)가 자동으로 연결해주는 것으로, 개발자가 빈(Bean) 설정파일에 의존관계가 필요한 정보를 추가해주면, 스프링 컨테이너가 자동적으로 연결해 준다
  • 의존성이란 한 객체가 다른 객체를 사용할 때 의존성이 있다고 한다.
  • 의존성 주입은 IoC(Inversion of Control: 제어의 역전)원칙 하에 객체 간의 결합을 약하게 해주고 유지보수가 좋은 코드를 만들어 준다. 또한 의존성 주입은 개발자들이 객체를 생성하는 번거로움과 다양한 케이스를 고려하는 겨우를 줄이고, 변수 사용과 개발에 더욱이 집중할 수있게 해준다.

* IoC 란?

  • IoC(Inversion of Control)란 "제어의 역전" 이라는 의미로, 말 그대로 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미한다.
  • 객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 하여 가독성 및 코드 중복, 유지 보수를 편하게 할 수 있게 한다.
  • 스프링이 모든 의존성 객체를 스프링이 실행될때 다 만들어주고 필요한곳에 주입시켜줌으로써 Bean들은 싱글턴 패턴의 특징을 가지며, 제어의 흐름을 사용자가 컨트롤 하는 것이 아니라 스프링에게 맡겨 작업을 처리하게 된다.

흐름의 변화 상세 설명 

더보기

기존의 순서는 아래와 같았다.

1. 객체 생성
2. 의존성 객체 생성 (클래스 내부에서 생성)
3. 의존성 객체 메소드 호출

하지만, 스프링에서는 다음과 같은 순서로 객체가 만들어지고 실행된다.

1.객체 생성
2. 의존성 객체 주입 (스스로가 만드는것이 아니라 제어권을 스프링에게 위임하여 스프링이 만들어놓은 객체를 주입한다.)
3. 의존성 객체 메소드 호출

 

 

② DI(의존성 주입)를 사용하는 이유?

  1. 재사용성을 높여준다.
  2. 테스트에 용이하다.
  3. 코드를 단순화 시켜준다.
  4. 사용하는 이유를 파악하기 수월하고 코드가 읽기 쉬워지는 점이 있다.
  5. 종속성이 감소하기 때문에 변경에 민감하지 않다.
  6. 결합도(coupling)는 낮추면서 유연성과 확장성은 향상 시킬 수 있다.
  7. 객체간의 의존관계를 설정할 수 있다.

 

③ 스프링에서 의존성을 주입하는 방법

  • 생성자에서 주입
  • 필드에서 주입
  • setter 에서 주입

 

참고 자료 https://velog.io/@gillog/Spring-DIDependency-Injection

스프링 프레임워크

 

①  스프링 프레임워크(Spring Framework)

  • 여러 프레임워크들 중 자바(JAVA)를 기반으로 하는 프레임워크 이다.
  • 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준프레임워크 이다.
  • 스프링의 다른 프레임워크와 가장 큰 차이점은 다른 프레임워크들의 포용이다. 이는 다시말해 기본 뼈대를 흔들지 않고, 여러 종류의 프레임워크를 혼용해서 사용할 수 있다는 점.

 

② 스프링 프레임워크 특징

  •  POJO(Plan Old Java Object)기반의 구성
    - 코드를 개발할 때 개발자가 특정한 라이버리나 컨테이너의 기술에 종속적이지 않다는 것을 의미
    - 쉽게말해 Java코드를 이용해서 객체를 구성하는 방식을 그대로 스프링에서 사용할 수 있다는 의미

 

  • 의존성 주입
    -  의존성 주입은 하나의 객체가 다른객체의 의존성을 제공하는 테크닉
    - "어떤 객체가 필요한 객체를 외부에서 밀어 넣는다."는 의미
    - "의존성 주입"을 사용하여 갖는 장점은 '주입을 받는 입장에서는 어떤 객체인지 신경 쓸 필요가 없다.', '어떤 객체에 의존하든 자신의 역할은 변하지 않는다.'이다.
    - "ApplicationContext"라는 존재가 필요한 객체들을 생성하고, 필요한 객체들을 주입하는 역할을 해주는 구조
    - "ApplicationContext가 관리하는 객체들을 "빈(Bean)"이라고 한다.
    - 빈과 빈 사이의 의존 관계를 'xml 설정', '어노테이션 설정', 'Java 설정 방식'을 통해서 처리 할 수 있다.

 

  • 관점지향프로그래밍(AOP)의 지원
    - 대부분의 시스템에서 '보안'이나 '로그', '트랜잭션'과 같이 무엇을 실행을 하든 반드시 처리가 필요한 부분이 있다. 이를 '횡단 관심사(cross-concern)'라고 한다. 
    - AOP는 이러한 횡단 관심사를 모듈로 분리하는 프로그래밍 패러다임이다.
    - 이 패러다임을 통해서 반복적인 코드를 줄이고, 핵심 비즈니스 로직에만 집중을 할 수 있다.

 

  • 높은 확장성
    - 스프링 프레임워크에 통합하기 위해 간단하게 기존 라이브러리를 감싸는 정도로 스프링에서 사용이 가능하다.
    - 따라서 수많은 라이브러리가 이미 스프링에서 지원되고 있고 스프링에서 사용되는 라이브러리를 별도로 분리하기도용이하다.

 

③ 스프링 프레임워크 사용이유(장점)

  • 정형화 되어 있기 때문에 일정수준의 품질을 기대 할 수 있다.
  • 개발 후 유지보수 및 기능의 확장성에서도 품질을 보장한다.
  • '전자표준 프레임워크'기 때문에 해당 프레임워크의 수요가 크다.(한국 한정)

 

④ 스프링 프레임워크 단점

  • 내부에서 많은 기능을 가졌기 때문에 상당히 무겁다.
  • 분명 많은 기능을 제공해서 편리하지만, 이 기능들을 습득하기위해 상당한 노력과 시간이 필요하다.

 

 

참고자료 : 

https://kimvampa.tistory.com/35

 

+ Recent posts