-
Spring 입문 1주차코딩공부/Spring 2023. 6. 12. 21:13
그레이들: 빌드 자동화 시스템
빌드: 작성한 소스코드를 실행 가능한 결과물(JAR 파일)로 만드는 과정
그레이들
- build.gradle 그레이들 기반의 빌드 스크립트 - 소스코드를 빌드 하거나 라이브러리들의 의존성을 쉽게 관리
- 그루비, 코들린 언어로 작성 가능
- 라이브러리들을 관리
- dependencies부분에 외부라이브러리들을 작성하면 maven repository라는 외부 저장소에서 자동으로 다운로드 해옴
- maven repository: 라이브러리들을 모아둔 저장소
- 라이브러리 간의 충돌이 생기지 않도록 관리
서버
네트워크: 여러 장비가 서로 연결되어 정보를 주고받을 수 있게 함
ip주소: 클라이언트가 서버에 정보를 요청할 때 요청이 해당 서버에 정확하게 도달할 수 있게 함
받는 주체 - 포트번호
웹 서버
- 브라우저가 웹 서버에 요청 - 기본적으로 GET
- API - 다른 소프트웨어 시스템과 통신하기 위한 규칙, 서로 다른 어플리케이션이 정해진 약속한 방식의 API요청을 수행하면 약속된 결과를 반환
- RESTful API - API 작동방식에 대한 조건을 부과하는 소프트웨어 아키텍처, 통신을 관리하기 위한 지침
- 메서드 - 요청하는 방식
WAS(웹 애플리케이션 서버): URL/ URI을 입력해서 어떠한 페이지를 요청했을 때 HTTP의 요청을 받아들여서 HTML과 같은 정적인 문서를 전달해 주는 역할을 하는 것이 웹 서버
정적인 컨텐츠 - 웹 서버가 브라우저로 전달
동적인 컨텐츠 - 웹 서버가 was에게 해당 요청을 전달 (웹 서버가 처리할 수 없음)
웹서버, was는 HPPT 기반으로 동작
웹서버에서 할 수 있는 기능 대부분을 was에서도 가능 -> 함께 사용해서 효율 향상
tomcat, j boss 등
apache tomcat -> 웹서버 + WAS
spring
오래되고 강력한 프레임워크
강력한 핵심 기능 - ioc/DI, AOP, PSA
xml 파일
spring boot
spring 의 불편함 개선
java의 애노테이션을 적극 사용
외부 라이브러리/ 하위 프레임워크 관리가 쉬워짐
라이브러리 버전을 자동으로 맞춰 줌
내장 아파치 톰캣
톰캣은 기본적으로 8080 포트를 사용
HTTP: 데이터를 주고받는 양식을 정의한 "통신 규약" 중 하나
매우 범용적인 양식을 가짐 -> 전 세계에서 제일 널리 쓰임
모든 브라우저 - HTTP를 기본적으로 지원
response data
status code
100 - 요청이 수신되었고, 현재 처리가 계속되고 있음
200 - http 요청이 성공적으로 처리되었음
300 - 클라이언트가 추가적인 조치를 취해야 함 (redirection에 주로 사용)
400 - 클라이언트에 오류가 있음(잘못된 요청, 인증 오류)
500 - 서버에 오류가 발생했음 (서버 오류, 서버 과부하)
request data
response headers: 서버가 웹페이지 데이터와 함께 보낸 추가적인 데이터
추가 데이터
반환 데이터
헤더
브라우저가 어떤페이지를 원하는지
요청받은 페이지를 찾았는지
요청받은 데이터를 성공적으로 보냈는지
어떤 형식으로 데이터를 보낼지
payload(http body)
실제 데이터를 담는 곳
GET 메서드를 제외하고 모두 페이로드를 보낼 수 있다 <- HTTP에서의 약속 - GET메서드는 http body가 존재하지 않기 때문
테스트 코드
버그 - 소프트웨어가 예상하지 못하는 결과를 내는 것
테스트 코드 - 소프트웨어가 예상한 결과를 내는지 모든 코드를 체크
블랙박스 테스트 - 웹서비스의 사용자 입장에서 테스트 / 기능이 증가할 수록 테스트 할 것이 증가 / 사람에 따라 테스트 퀄리티가 달라짐
개발자 테스트 - 개발자가 직접 본인이 작성한 코드를 검증하기 위해 테스트 코드를 작성 / 빠르고 정확 / 테스트 자동화 가능 / 개발시간이 오래 걸림 / 테스트 코드 유지보수 비용이 많이 듦
junit - spring에서 제공하는 자바 프로그래밍 언어용 단위 테스트 프레임워크 / 테스트 실행환경을 따로 가지고 있음(main()메서드가 없어도 실행 가능)
ctrl + shift + T : 테스트 파일 생성 단축키
j-unit
자바 프로그래밍 언어용 단위 테스트 프레임워크
테스트 파일
Test annotation이 있어야 함(@Test)
실제 테스트 Assertions를 사용해서 동작을 검사 - 예상하는 값 입력, 실제 결과 -> 같은지 비교
모든 경우를 테스트 하는 것 - 단위 테스트에서 edge별로 테스트한다고 표현
Lombok
필수적인 메서드, 생성자 등을 자동으로 생성 -> 코드 절약 라이브러리
설정: ctrl + Alt + S -> Annotation process -> Enable annotation process 체크 / shift 두번 누르기 -> flugins
선언한 필드에 대해 -> getter annotation 달고 빌드 -> 기본 생성자, getter 생성
인텔리j에서: 우클릭 + generate -> 생성할 메서드 선택 -> ok -> 메서드 생성
@Getter: getter 생성
@Setter: setter 생성
@AllArgsConstructior: 모든 필드를 파라미터로 가진 오버로딩된 생성자를 만들어 줌
@NoArgsConstructor: 기본 생성자를 만들어 줌
@RequiredArgsConstructor: final 제어자가 붙은 필드를 파라미터로 가진 오버로딩된 생성자를 만들어 줌
하나라도 생성자가 있으면 -> 컴파일러는 기본 생성자를 만들어주지 않음
application.properties
src.resources 밑에 있는 파일
spring boot를 사용할 때 개발에 필요한 자동 설정들의 설정 값들을 쉽게 수정할 수 있음 / 데이터베이스에 연결할 때 데이터베이스에 정보를 제공해야 하는데 그때도 사용
추가학습 -> application.yml 검색하기
spring MVC
MVC: MVC 디자인 패턴(효율적인 방법을 패턴화 해둠)
모델-뷰-컨트롤러로 역할 분담
모델: 데이터, 비즈니스 로직 담당 / 데이터베이스와 연동하여 데이터를 저장하고 불러오는 역할
뷰: 사용자가 보는 화면 담당, 버튼, 폼 등 디자인 구현
컨트롤러: 모델과 뷰 사이에 상호작용 조절, 제어 / 사용자 요청을 입력받아서 모델에게 전달 -> 결과를 바탕으로 뷰를 업데이트
MVC 패턴을 활용하여 구조를 잘 설계하는 것이 중요
spring MVC
spring에서 MVC 디자인 패턴을 활용하여 HTTP 요청을 효율적으로 처리하고 있음
servlet: 자바를 사용하여 웹 페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양
톰캣 안에서 서블릿이 동작
http를 분석해서 그 안에 들어있는 사용해야할 데이터, 정보들을 httpServletRequest에 넣어 줌
DispatcherServlet 객체는 분석한 데이터를 토대로 Handler mapping을 통해 Controller를 찾아 요청을 전달해 줌
controller
연습 코드
@Controller public class HelloController { @GetMapping("/api/hello") @ResponseBody public String hello() { return "Hello World!!"; } @GetMapping("/api/get") @ResponseBody public String get() { return "Get Method 요청"; } @PostMapping("/api/post") @ResponseBody public String post(){ return "POST Method 요청"; } @PutMapping("/api/put") @ResponseBody public String put(){ return "put method 요청"; } @DeleteMapping("api/delete") @ResponseBody public String delete(){ return "Delete Method 요청"; } }
@Controller: 클래스를 Spring MVC 컨트롤러로 표시하는 데 사용 / 해당 클래스가 컨트롤러의 역할을 수행할 수 있도록 등록
@RequestMapping(경로): 중복되는 URL를 클래스 위에 표시
@GetMapping: 각각의 HTTP Method에 매핑
@PostMapping
@PutMapping
@DeleteMapping
@ResponseBody: html이 아닌 정보를 반환하려고 할 때 사용
api 경로는 중복될 수 있지만 메서드는 달라야 함
정적페이지와 동적 페이지
정적인 페이지 반환
- static 폴더에 있는 html에 접근하는 방법
- url 경로에서 직접 접근
- thymeleaf가 걸려있지 않은 상태에서 컨트롤러를 거쳐서 반환
- redirect 이용 - "redirect:/hello.html"
- templates폴더에 있는 html에 접근하는 방법
- .html 없이 파일 이름만 써도 html 폴더 반환
예시 코드
@Controller public class HtmlController { @GetMapping("/static-hello") public String hello() { return "hello.html"; } @GetMapping("/html/redirect") public String htmlStatic() { return "redirect:/hello.html"; } @GetMapping("/html/templates") public String htmlTemplates(){ return "hello"; } }
동적인 페이지 반환
모델 - 스프링에서 객체로 제공 <- 컨트롤러에서 넣어줌
데이터를 클라이언트에 반환하는 방법
최근 - json 형태로 데이터를 반환
기본적인 html파일 요청을 제외하고는 json 데이터를 요청하는 API를 통해서 브라우저에서 html을 조작하여 반영하는 식으로 강의 진행
클라이언트에서 최초 리퀘스트 -> html 반환 ->(이후) AJAX를 통해 비동기적으로 요청 -> JSON 형태로 반환
JSON 형태 - 서버에서 읽을 수 없음, 자바에 없고 js쪽에 있는 타입 -> JSON형태를 스트링 타입으로 클라이언트에 반환(컨텐츠 타입: text / html)
스프링 내부에서 JAVA 객체를 자동으로 JSON 형태로 변환시켜 줌
예시 코드
helloStringJson(): JSON형태를 스트링 타입으로 클라이언트에 반환(컨텐츠 타입: text / html)
helloClassJson(): 컨텐츠 타입: application/json
스프링 - 내부적으로 자바의 객체를 JSON 타입으로 바꿈. 그러면서 컨텐츠 타입을 무엇으로 반환하겠다 설정을 함 -> 브라우저: 데이터를 JSON 형식으로 바로 보여줌
RestController: Controller + ResponseBody
jackson: JSON 구조를 처리해 주는 라이브러리 / 자바의 객체(오브젝트)를 JSON 타입의 String으로 변환해 줄 수 있고, String을 오브젝트로 변환할 수도 있음
serialize(직렬화): 객체 형태의 값을 JSON화 하는 과정
path Variable과 Request Raram
클라이언트에서 서버에 데이터를 보냄 -> 다양한 방식이 있음
path Variable: 서버에 보내려는 데이터를 URL 경로에 추가할 수 있음
필요한 데이터 부분에 {변수명}
매개변수 앞에 @PathVariable
예시코드
@GetMapping("/star/{name}/age/{age}") @ResponseBody public String helloRequestPath(@PathVariable String name, @PathVariable int age) { return String.format("Hello, @PathVariable.<br> name = %s, age = %d", name, age); }
클라이언트에서 어떤 방식으로 데이터를 보내올 것인지 -> 소통 (예: API 테이블)
@RequestParam(Query String)
?키=값&키=값
많이 사용되는 방식
생략 가능함
예시코드
@GetMapping("/form/param") @ResponseBody public String helloGetRequestParam(@RequestParam(required = false) String name, @RequestParam int age) { return String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age); }
(required = false): 해당 매개변수의 값이 들어오지 않아도 오류가 발생하지 않음 (Path variable도 동일), 대신 null로 초기화
http데이터를 객체로 처리하는 방법
@ModelAttribute: 바디 부분에 들어온 쿼리 스트링 데이터를 객체에 맵핑해서 가지고 올 수 있게 함
필드 이름 - 클라이언트 데이터랑 동일하게
쿼리 스트링이 너무 많이 들어올 때 인스턴스를 통해 데이터를 한 번에 받을 수 있도록 스프링에서 만들어 둠 (데이터를 받아오기 위해서는 클래스에 setter 혹은 오버로딩된 생성자가 필요함)
생략 가능 -> simpleValueType일 경우 @RequestParam으로 간주 / 아닐 경우 @ModelAttribute로 간주
Body에 JSON형식으로 넘어옴(JSON to Object), 컨텐츠 타입: application/json -> spring한테 요청해야 함 -> @RequestBody 로 표시
예시코드
@PostMapping("/form/json") @ResponseBody public String helloPostRequestJson(@RequestBody Star star) { return String.format("Hello, @RequestBody.<br> (name = %s, age = %d) ", star.name, star.age); }
메모장 프로젝트
로컬호스트 호출 -> static 내의 index.html 반환(기본)
DTO(Data Transfer Object): 데이터 전송 및 이동을 위해 생성되는 객체 / 데이터를 받아올때는 RequestDto, 응답할 때는 ResponseDto
DB와 소통하는 클래스 - 조심스럽게 다뤄야 함
ctrl + alt + L: 정렬
DataBase: 데이터의 집합
DBMS: DataBase를 관리하고 운영하는 소프트웨어
RDBMS: 관계형 데이터베이스 , 테이블이라는 최소단위로 구성, 테이블은 열과 행으로 이루어져 있음
칼럼 - 클래스의 필드 하나
로우 - 클래스의 객체 하나와 유사
SQL: RDBMS에서 사용되는 언어
- DDL: 데이터 정의어
- CREADTE
- ALTER
- DROP
- TRUNCATE
- DML: 데이터 제어어
- INSERT
- SELECT
- UPDATE
- DELETE
- DCL: 데이터 조작어
- GRANT
- REVOKE
CREATE: 제약조건이 있음
데이터 삽입 - VALUES를 사용해 데이터를 삽입할 때에는 모든 속성의 데이터를 입력해야 함. 일부만 입력하고 싶을 때에는 앞에 속성을 명시
JDBC: 데이터베이스에 접근할 수 있도록 자바에서 제공하는 API
애플리케이션 - 데이터베이스 소통: JDBC가 역할 담당
데이터베이스변경? -> 연결코드를 전부 수정해야 함 -> JDBC 등장
JDBC 드라이버: DB 회사들은 자신들의 DB에 맞도록 JDBC인터페이스를 구현한 후 라이브러리로 제공, 이를 JDBC 드라이버라 부름
드라이버만 교체하면 손쉽게 데이터베이스 변경 가능
JDBC 템플릿: DB에 연결하기 위한 작업 로직 중 반복적이고 중복되는 작업들을 대신 처리
Spring JBDC 중 하나
build.gradle > dependences에 다음 코드 삽입
// MySQL
implementation 'mysql:mysql-connector-java:8.0.28'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'실수 메모
JDBC실습 중 오류가 계속 났다
원인을 찾았는데 비밀번호를 잘못된 방식으로 입력해서였다.
다음 코드에서 비밀번호를 입력할 때 {}는 지웠어야 했는데 그러지 않아서 생긴 문제였다.
spring.datasource.url=jdbc:mysql://localhost:3306/memo spring.datasource.username=root spring.datasource.password={비밀번호} spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
1주차 숙제
1번 - 작성한 답안
CREATE TABLE IF NOT EXISTS MANAGER ( id bigint, name varchar(100) not null check ( name >= 2 ), student_code varchar(100), primary key(id), foreign key(student_code) references student(student_code), constraint manager_fk_student_code CHECK (student_code is not null) );
해답
CREATE TABLE IF NOT EXISTS MANAGER ( id bigint, name varchar(100) not null, student_code varchar(100) not null, primary key(id), constraint manager_fk_student_code foreign key(student_code) references student(student_code) );
2번
ALTER TABLE MANAGER MODIFY id bigint auto_increment;
해답
ALTER TABLE MANAGER MODIFY COLUMN id bigint auto_increment;
3번
INSERT INTO manager(name, student_code) VALUES ('managerA', 's1'), ('managerA', 's2'), ('managerA', 's3'), ('managerA', 's4'), ('managerA', 's5'), ('managerB', 's6'), ('managerB', 's7'), ('managerB', 's8'), ('managerB', 's9');
4번
SELECT s.name, score FROM manager m JOIN student s ON m.student_code = s.student_code JOIN exam e on s.student_code = e.student_code WHERE m.name = 'managerA';
5번
ALTER TABLE exam ADD CONSTRAINT score FOREIGN KEY (student_code) REFERENCES student(student_code) ON DELETE CASCADE; ALTER TABLE manager ADD CONSTRAINT name FOREIGN KEY (student_code) REFERENCES student(student_code) ON DELETE CASCADE;
해답
ALTER TABLE EXAM DROP CONSTRAINT exam_fk_student_code; ALTER TABLE EXAM ADD CONSTRAINT exam_fk_student_code FOREIGN KEY(student_code) REFERENCES STUDENT(student_code) ON DELETE CASCADE; ALTER TABLE MANAGER DROP CONSTRAINT manager_fk_student_code; ALTER TABLE MANAGER ADD CONSTRAINT manager_fk_student_code FOREIGN KEY(student_code) REFERENCES STUDENT(student_code) ON DELETE CASCADE; DELETE FROM STUDENT WHERE student_code = 's1';
'코딩공부 > Spring' 카테고리의 다른 글
Spring 심화 1주차 (0) 2023.07.11 Spring 숙련 2주차(작성중) (0) 2023.06.26 Spring 숙련 1주차 (0) 2023.06.21 Spring 입문 2주차 (0) 2023.06.16