DAY52 : TIL [SPRING 1일차]

안휘원·2021년 11월 3일
2

spartacodingclub

목록 보기
30/39

오늘부터 spring 기간이 시작됐다.
앞서 서버리스에서 겪었던 아픈(😭) 경험으로, 이번엔 결코 놓치지 않겠다 이를 갈았다.

📚 스프링(Spring)이란?

I. 개요

  • 자바(Java)라는 언어를 바탕으로, "서버"를 만드는 데 필요한 웹 프레임워크이다.
  • 스프링부트(Spring Boot) : 기존 스프링에서 좀 더 향상된 속도의 개발을 위해 개발된 프레임워크

    자바 vs 파이썬:

    특징JAVA👇PYTHON
    방식CompileInterpreter
    코드량복잡하고 많다>간결하다
    개발속도느리다>빠르다
    언어속도나름 빠르다<자바보다 느리다

II. 구성 및 처리 과정

  1. Controller

    • 순서
      ① Client로부터 요청을 받음
      ② 받은 요청을 서비스에게 전담
      ③ Client에게 응답
  2. Service

    • Controller로부터 전달받은 Client 요청(=비즈니스 로직) 처리
    • DB 정보 필요 시, Repository에게 전담
  3. Repository
    - DB 관리 (e.g. 연결, 해제, 자원관리)
    - DB CRUD 작업 처리


III. 개념 정리

  1. Annotation (주석, @)
    프로그램에게 추가적인 정보를 제공해주는 *메타데이터의 역할이며, 특별한 의미 혹은 기능을 수행하도록 하는 기술
    *데이터를 부연설명하기 위한 데이터

    Annotation의 용도 = 정보 제공
    • to 컴파일러(번역기) → 코드 작성 문법 에러 체크
    • to 개발 툴 → 빌드 or 배치 시 코드 자동 생성

  1. Object, Class, Instance (객체, 클래스, 인스턴스)
    수업에서 '클래스는 붕어빵 틀 or 토끼, 객체는 붕어빵 or 상태나 행동'이라는 비유를 들었다. 서치 중 보다 이해하기 쉬운 개념 정리본을 찾아서 아래와 같이 가져왔다.

    Object(객체) = 소프트웨어 세계에 구현할 대상
    Class(클래스) = Object를 구현하기 위한 청사진(설계도)
    Instance(인스턴스) = 설계도에 따라 소프트웨어 세계에 구현된 실체

  1. Static
    객체(인스턴스)에 소속되지 않고, 클래스별로 관리되기 때문에 클래스의 로딩이 끝나는 즉시 바로 사용 가능
    Garbage Collector의 관리 영역 밖에 존재하므로, Static 내의 메모리는 프로그램의 종료시까지 존재

    장점
    • 모든 객체가 메모리를 공유하여, 어디서든지 참조 가능 (global state)
    • 인스턴스를 생성하지 않아도 호출할 수 있으므로, 시간 절약 및 코드 단순화 가능 (절차지향적 코드)

    단점
    • 모든 객체가 메모리를 공유하는 global state이므로, 오류 발생 시 오류를 찾기 위해 넓은 범위 탐색 필요
    • 남발할 경우, 메모리 부족 현상 발생 및 만들고자 하는 시스템 성능 감소 (메모리가 프로그램 종료 시까지 존재해서)
    *오버라이딩을 할 수 없기 때문에 클래스 확장에 한계 존재
    *부모클래스로부터 상속받은 메소드를 재정의하는 것. 오버라이딩된 메소드는 부모 클래스의 원래 메소드보다 우선되기 때문에 자식 객체에서 메소드 호출 시 오버라이딩 된 메소드가 호출된다.

  1. Getter / Setter
    Getter는 정보를 '가져오는' 메소드이고, Setter는 정보를 '바꾸는' 메소드이다.

    When and Why?
    클래스 중에는 고객의 비밀번호/결제정보처럼 민감한 정보들을 담고 있는 것들이 있다. '외부'에서 이러한 정보들에 접근하여 멋대로 값을 바꾼다면 난감해질 것이다. 이를 막기 위해 필드를 publicprivate으로 구분하고, get(Getter)과 set(Setter)을 사용해 값을 '내부'에서 가져오고, 바꾸는 것이다.

  1. Interface
    수업에서 들은 개념으로는, '클래스에서 멤버가 빠진 메소드 모음집'이며, 모든 기능을 정의만! 해두고 구현은 하지 않은 것이라고 했다. 좀 더 자세한 이해가 필요한 것 같아 서치를 하다가, 자세하고 친절하게 설명된 블로그를 발견했다.

    • 구현 안 된, 밑그림만 있는 기본 설계도. 표준, 약속, 규칙.
    • 자바에서 클래스들이 구현해야하는 동작을 지정하는 용도로 사용
    • class 대신 interface라는 키워드를 이용하여 선언 가능
    • 클래스에서 implements 키워드를 사용하여 구현 (≒ class의 extends)
    • 하나의 클래스는 여러개의 인터페이스를 상속받아 구현 가능

    When and Why?
    1) Cooperation (협업)
    • 팀 작업을 할때, 팀원들과 미리 인터페이스를 작성함으로써 메소드를 정할 수 있다.
    2) Easy to replace (교체 용이)
    • 예를 들어, 객체를 수정해야 할 일이 생길 때마다 일일히 객체를 수정할 필요 없이 해당 조건에 맞는 클래스를 생성하여 추가하는 것으로 해결이 가능하다.
    • 개방폐쇄(Open Close)법칙인 확장에는 열려있고 변경에는 닫혀있는 클래스간 결합도(코드 종속성)를 낮춘 유연한 방식의 프로그래밍이 가능해진다.
    (사실 이 부분은 직접 여러번 실습을 해봐야 이해가 더 잘 될 것 같다.)
    3) Multi Inheritance (다중 상속)
    • 한 클래스에 여러개의 인터페이스를 상속받을 수 있기 때문에, 클래스 내에서 한번에 관리가 가능하다.

  1. RDBMS (Relational DataBase Management System)
    컴퓨터에 정보를 저장하고 관리하는 기술. 모든 서비스들의 메인 DB.
    종류로는 H2, MySQL, PostgreSQL, Oracle Database 등이 있다.

    • H2: *In-memory DB의 대표주자
    *서버가 작동하는 동안에만 내용을 저장하고, 서버가 작동을 멈추면 데이터가 모두 삭제되는 데이터베이스
    • MySQL: 서버 배포 시 사용하는 데이터베이스 중 하나

  1. JPA (Java Persistence API)
    JAVA가 DB를 사용하도록 도와, *SQL을 쓰지 않고 데이터를 생성, 조회, 수정, 삭제할 수 있도록 해주는 번역기.
    *데이터를 생성하고, 읽고하고, 변경하고, 삭제하는 구체적인 문법(CRUD)

    즉, 객체들끼리 relation을 맺으면 SQL문이 알아서 생성되는 식의 DB 처리를 해주는 데이터베이스 프레임워크이다.
    (= ORM을 사용하기 위한 인터페이스를 모아둔 것)

    @Entity: DB에 저장하기 위해 유저가 정의한 클래스. @Entity로 선언된 클래스의 이름은 실제 DB의 테이블 명과 일치하는 것을 매핑
    @Id: primary key를 가지는 변수를 선언한다는 뜻
    @Table: 별도의 이름을 가진 DB 테이블과 매핑. @Entity의 클래스명과 DB의 테이블명이 다를 경우 @Table(name=" ") 형식으로 매핑 가능.
    @Column: 필수 선언 클래스는 아니지만, column에 언더바(_) 존재 시에는 필요. 기본적으로 멤버 변수명과 일치하는 DB column을 매핑.@Column(name=" ")형식으로 작성 가능.

  1. JPARepository
    JPA에 특화된 기능을 추가로 제공하는 인터페이스이다.
    인터페이스에 미리 검색 메소드를 정의 해두는 것으로, 메소드를 호출하여 기능 사용이 가능하다. 또한, 인터페이스에 따로 @Repository등의 어노테이션을 추가할 필요가 없다.

    주의사항
    변수명을 delete(String example_one)처럼 (_) 사용 시 적용이 불가능하므로, delete(String exampleOne)과 같이 변수명을 카멜케이스로 맞춰줘야 한다.
    Method(메소드)기능
    save()레코드 저장(insert, update)
    findOne()primary key로 레코드 한건 찾기
    findAll()전체 레코드 불러오기. 정렬(sort), 페이징(pageable) 가능
    count()레코드 갯수
    delete()레코드 삭제

IV. JAVA 문법

  • System.out.println(): 출력기능. sout 타입 후 Tab을 눌러 입력 가능
  • boolean: true, false. 대문자 사용 불가
    - 예시:
public class Prac {
	public static void main(String[] arg) {
          int myAge = 20;
          boolean isAdult = myAge > 20;
          boolean isKid = myAge <= 20;

          System.out.println(isAdult);
          System.out.println(isKid);
          System.out.println(myAge == 20);	// true
          System.out.println(myAge != 20);	// false
      }
}

  • List<String> myList = new ArrayList<>();: 배열(List) 선언. 순서 중요 or 같은 자료형만 입력 가능
    - .add: 입력
    - .get: 조회
    - .remove: 제거
    - 예시:
public class Prac {

    public static void main(String[] args) {
        List<String> myList = new ArrayList<>();

        String course1 = "웹개발의 봄 Spring";
        String course2 = "프론트엔드의 꽃 React";

        myList.add(course1);
        myList.add(course2);
        System.out.println(myList);

        System.out.println(myList.get(1));

        myList.remove(1);
        System.out.println(myList);
    }
}

💬 Reference

GilLog | [Spring] Annotation 정리
Alfred’s Computing Weblog | Class vs Object vs Instance
코딩팩토리 | 자바 static의 의미와 사용법
랄라라 | 왜 자바에서 static의 사용을 지양해야 하는가?
멍청한토끼 | 자바(Java) - Interface란 무엇인가(정의, 사용이유, 예제)?
쥬니의 개발블로그 | [Spring JPA] jpa 사용하기 - JpaRepository

profile
우당탕탕 개발자 성장일지

4개의 댓글

comment-user-thumbnail
2021년 11월 4일

너무 깔끔하고 잘 정리됬네요! :D
참조도 그렇고 TIL에서 엄청난 노력이 느껴지는 글이였습니다. ^^7

1개의 답글
comment-user-thumbnail
2021년 11월 5일

오오 휘원님 정리 정말 깔끔하게 잘하시는거같아요!!!!
자극받고 갑니다 총총총 🥺👍

1개의 답글