오늘부터 spring 기간이 시작됐다.
앞서 서버리스에서 겪었던 아픈(😭) 경험으로, 이번엔 결코 놓치지 않겠다 이를 갈았다.
📚 스프링(Spring)이란?
I. 개요
- 자바(Java)라는 언어를 바탕으로, "서버"를 만드는 데 필요한 웹 프레임워크이다.
- 스프링부트(Spring Boot) : 기존 스프링에서 좀 더 향상된 속도의 개발을 위해 개발된 프레임워크
자바 vs 파이썬:
특징 | JAVA | 👇 | PYTHON |
---|
방식 | Compile | ≠ | Interpreter |
코드량 | 복잡하고 많다 | > | 간결하다 |
개발속도 | 느리다 | > | 빠르다 |
언어속도 | 나름 빠르다 | < | 자바보다 느리다 |
II. 구성 및 처리 과정
-
Controller
- 순서
① Client로부터 요청을 받음
② 받은 요청을 서비스에게 전담
③ Client에게 응답
-
Service
- Controller로부터 전달받은 Client 요청(=비즈니스 로직) 처리
- DB 정보 필요 시, Repository에게 전담
-
Repository
- DB 관리 (e.g. 연결, 해제, 자원관리)
- DB CRUD 작업 처리
III. 개념 정리
- Annotation (주석, @)
프로그램에게 추가적인 정보를 제공해주는 *메타데이터의 역할이며, 특별한 의미 혹은 기능을 수행하도록 하는 기술
*데이터를 부연설명하기 위한 데이터
Annotation의 용도 = 정보 제공
• to 컴파일러(번역기) → 코드 작성 문법 에러 체크
• to 개발 툴 → 빌드 or 배치 시 코드 자동 생성
- Object, Class, Instance (객체, 클래스, 인스턴스)
수업에서 '클래스는 붕어빵 틀 or 토끼, 객체는 붕어빵 or 상태나 행동'이라는 비유를 들었다. 서치 중 보다 이해하기 쉬운 개념 정리본을 찾아서 아래와 같이 가져왔다.
• Object(객체) = 소프트웨어 세계에 구현할 대상
• Class(클래스) = Object를 구현하기 위한 청사진(설계도)
• Instance(인스턴스) = 설계도에 따라 소프트웨어 세계에 구현된 실체
- Static
객체(인스턴스)에 소속되지 않고, 클래스별로 관리되기 때문에 클래스의 로딩이 끝나는 즉시 바로 사용 가능
Garbage Collector의 관리 영역 밖에 존재하므로, Static 내의 메모리는 프로그램의 종료시까지 존재
장점
• 모든 객체가 메모리를 공유하여, 어디서든지 참조 가능 (global state)
• 인스턴스를 생성하지 않아도 호출할 수 있으므로, 시간 절약 및 코드 단순화 가능 (절차지향적 코드)
단점
• 모든 객체가 메모리를 공유하는 global state이므로, 오류 발생 시 오류를 찾기 위해 넓은 범위 탐색 필요
• 남발할 경우, 메모리 부족 현상 발생 및 만들고자 하는 시스템 성능 감소 (메모리가 프로그램 종료 시까지 존재해서)
• *오버라이딩을 할 수 없기 때문에 클래스 확장에 한계 존재
*부모클래스로부터 상속받은 메소드를 재정의하는 것. 오버라이딩된 메소드는 부모 클래스의 원래 메소드보다 우선되기 때문에 자식 객체에서 메소드 호출 시 오버라이딩 된 메소드가 호출된다.
- Getter / Setter
Getter는 정보를 '가져오는' 메소드이고, Setter는 정보를 '바꾸는' 메소드이다.
When and Why?
클래스 중에는 고객의 비밀번호/결제정보처럼 민감한 정보들을 담고 있는 것들이 있다. '외부'에서 이러한 정보들에 접근하여 멋대로 값을 바꾼다면 난감해질 것이다. 이를 막기 위해 필드를 public
과 private
으로 구분하고, get
(Getter)과 set
(Setter)을 사용해 값을 '내부'에서 가져오고, 바꾸는 것이다.
- Interface
수업에서 들은 개념으로는, '클래스에서 멤버가 빠진 메소드 모음집'이며, 모든 기능을 정의만! 해두고 구현은 하지 않은 것이라고 했다. 좀 더 자세한 이해가 필요한 것 같아 서치를 하다가, 자세하고 친절하게 설명된 블로그를 발견했다.
• 구현 안 된, 밑그림만 있는 기본 설계도. 표준, 약속, 규칙.
• 자바에서 클래스들이 구현해야하는 동작을 지정하는 용도로 사용
• class 대신 interface
라는 키워드를 이용하여 선언 가능
• 클래스에서 implements
키워드를 사용하여 구현 (≒ class의 extends
)
• 하나의 클래스는 여러개의 인터페이스를 상속받아 구현 가능
When and Why?
1) Cooperation (협업)
• 팀 작업을 할때, 팀원들과 미리 인터페이스를 작성함으로써 메소드를 정할 수 있다.
2) Easy to replace (교체 용이)
• 예를 들어, 객체를 수정해야 할 일이 생길 때마다 일일히 객체를 수정할 필요 없이 해당 조건에 맞는 클래스를 생성하여 추가하는 것으로 해결이 가능하다.
• 개방폐쇄(Open Close)법칙인 확장에는 열려있고 변경에는 닫혀있는 클래스간 결합도(코드 종속성)를 낮춘 유연한 방식의 프로그래밍이 가능해진다.
(사실 이 부분은 직접 여러번 실습을 해봐야 이해가 더 잘 될 것 같다.)
3) Multi Inheritance (다중 상속)
• 한 클래스에 여러개의 인터페이스를 상속받을 수 있기 때문에, 클래스 내에서 한번에 관리가 가능하다.
- RDBMS (Relational DataBase Management System)
컴퓨터에 정보를 저장하고 관리하는 기술. 모든 서비스들의 메인 DB.
종류로는 H2, MySQL, PostgreSQL, Oracle Database 등이 있다.
• H2: *In-memory DB의 대표주자
*서버가 작동하는 동안에만 내용을 저장하고, 서버가 작동을 멈추면 데이터가 모두 삭제되는 데이터베이스
• MySQL: 서버 배포 시 사용하는 데이터베이스 중 하나
- 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=" ")
형식으로 작성 가능.
- 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);
System.out.println(myAge != 20);
}
}
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
너무 깔끔하고 잘 정리됬네요! :D
참조도 그렇고 TIL에서 엄청난 노력이 느껴지는 글이였습니다. ^^7