티스토리 뷰
1장 스프링부트 개발 준비하기 1-03, 1-04 요약 (웹 서비스 동작 원리, IP와 도메인, localhost:8080 이해)
여행자0 2024. 12. 11. 17:20
https://wikidocs.net/book/7601
점프 투 스프링부트
"점프 투 스프링부트"는 "Spring Boot Board(SBB)"라는 이름의 게시판 서비스를 만들어가는 과정을 설명한 스프링부트 입문서이다. 자바 설치부터 시작하여 서비스 운…
wikidocs.net
아래 서술한 내용은 "점프 투 스프링부트"를 공부하고 복습 겸 요약하여 작성한 내용입니다.
무료로 전자책을 배포해주신 박응용 님께 감사의 인사를 드립니다!
* 개념적인 부분은 대부분 서술하였으나 생략된 내용이 있을 수 있습니다.
* 개인적으로 공부한 내용을 추가하여 서술한 부분이 있습니다.
1-03 스프링부트 맛보기
웹 서비스는 어떻게 동작할까?
- 클라이언트와 서버 구조 이해하기
클라이언트 : 사용자가 사용하는 브라우저(크롬, 사파리)
서버 : 브라우저로 접속 가능한 원격 컴퓨터
주소창에 google.com 이라고 입력하는 행위 = 웹 브라우저에서 서버에게 특정 페이지 열어달라 "요청" 하는 것
웹 브라우저에 특정 페이지가 열리는 결과 = 서버가 요청에 대한 "응답"을 브라우저에게 돌려주는 것
웹브라우저에서 서버로 요청을 보낼 때는
서버의 주소(IP 주소) 또는 서버의 주소를 대체할 수 있는 도메인명을 알아야 한다.
* 사용자의 입장에서, 서버의 IP 주소를 입력하여 웹 페이지에 접속하는 것은 편리하지 않다.
* 그래서 사용자는 도메인을 입력하여 접속한다. 'google.com' 이라는 문자열 자체를 도메인(domain) 이라 한다.
* IP 주소 대신 도메인을 입력하면, 웹브라우저는 도메인과 연결된 IP주소를 찾아서 이동해준다.
이것을 도메인 네임 시스템(DNS) 라고 한다.
도메인과 IP의 연결 정보를 담고 있는 서버를 네임 서버(Name Server) 라고 한다.
- IP 주소와 포트 이해하기
서버는 브라우저로 접속할 수 있는 웹 서비스(웹 페이지) 뿐만 아니라, FTP, 이메일 서비스 등도 운용할 수 있다.
하지만 보통 서비스별로 다른 IP 주소를 사용하지는 않는다.
왜냐하면 포트로 이러한 서비스들을 구분할 수 있기 때문이다.
* 포트(port) : 네트워크 서비스를 구분하는 번호. "논리적인 접속 장소"를 의미.
하나의 서버 주소(single instance server)에서 다양한 포트를 사용하여 많은 서비스 운용 가능
A 컴퓨터에서는 웹 페이지 요청을, B 컴퓨터에서는 이메일 서비스 요청을 한다고 가정해보자.
이때 A와 B는 동일한 IP 주소(single instance server)로 요청을 하되, 특정 서비스의 포트번호를 함께 날린다.
그러면 서버는 포트 번호를 통해, 어느 서버로 보내는 요청인지 특정할 수 있다.
프로토콜 | 서비스 내용 | 포트 |
HTTP | 웹 서비스 | 80 |
HTTPS | SSL을 적용한 웹 서비스 | 443 |
FTP | 파일 전송 서비스 | 21 |
SSH, SFTP | 보안이 강화된 TELNET, FTP 서비스 | 22 |
TELNET | 원격 서버 접속 서비스 | 23 |
SMTP | 메일 전송 서비스 | 25 |
위 표에 있는 포트 번호는 기본 포트 번호로,
클라이언트나 서버 등에서 대부분 이 번호를 기본값으로 설정한다.
하지만 필요에 따라 포트 번호를 별도로 정의하고 변경할 수 있다.
ex) HTTP 포트를 80 대신 8080 으로 사용
* 브라우저에 naver.com 대신 naver.com:443 을 입력하면 기존과 동일하게 동작함을 알 수 있다.
- localhost:8080 이해하기
localhost 라는 도메인의 의미 : 127.0.0.1이라는 IP 주소를 의미
127.0.0.1 라는 IP 주소의 의미 : 내 컴퓨터를 의미
즉, localhost:8080은, 내가 사용하는 컴퓨터의 8080번 포트로 서비스를 운용하겠다 라는 의미이다.
컨트롤러 만들기
*** 컨트롤러를 만드는 과정은 따로 서술하지 않고 넘어가겠다.
1-04 스프링부트 도구 설치하기
Spring Boot Devtools 라이브러리
: 코드에 수정이 일어났을때 서버를 자동 재시작해주는 라이브러리
lombok 라이브러리
: Getter 메서드, Setter 메서드, 생성자 등을 자동으로 만들어주는 라이브러리
데이터를 처리할 때 필요한 엔티티 클래스와 DTO 클래스 등에서는 @Getter, @Setter가 자주 사용되고
컨트롤러나 서비스 단에서는 생성자 주입하기 위해 @RequiredArgsConstructor 가 자주 사용된다.
dependencies {
//Spring Boot Devtools : 코드수정시 자동 서버재기동
developmentOnly 'org.springframework.boot:spring-boot-devtools'
//lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}
build.gradle 의 dependencies에 추가해준다.
**** 롬복 라이브러리는 dependencies 만 작성한다고 해서 적용되지 않는다.
직접 설치하여 세팅해주는 작업이 필요하다.
점프 투 스프링부트 교재에서는 이런 부분을 친절히 설명해두고 있어서 수월하게 넘어갔지만,
이전에 혼자 프로젝트를 진행하다가 롬복 라이브러리 세팅하면서 문제를 발견한 적이 있었다.
그때의 해결 과정을 아래 링크의 게시글로 남겨두었다.
https://dev-traveler.tistory.com/6
"점프 투 스프링부트" 교재에서의 설명은 아래 링크를 참고하면 된다.
<Gradle 프로젝트에서 의존성을 정의할 때 사용하는 키워드 설명>
* implementation : 컴파일 타임과 런타임 모두에 적용된다는 의미.
해당 라이브러리의 클래스와 메소드가 컴파일과, 런타임 모두에 필요할 경우 사용.
그러므로, jar, war 파일에 포함된다.
* developmentOnly : 해당 라이브러리는 개발 환경에만 적용된다는 의미로,
운영환경에 배포되는 jar, war 파일에는 이 라이브러리가 포함되지 않는다.
--> 코드수정시 자동 재기동 되는 부분은 개발할때만 사용하면 되는 기능이므로 developmentOnly 을 사용한다.
* compileOnly : 해당 라이브러리는 컴파일 타임에만 필요하다는 의미로,
운영환경에 배포되는 jar, war 파일에는 이 라이브러리가 포함되지 않는다.
* annotationProcessor : 컴파일 할 때 중간에 끼어들어서 annotation이 붙어있는 소스코드를 참조하여 추가적인 소스코드를 삽입시키게 한다.
--> 롬복을 사용하면 java 파일에 @Getter @Setter 선언을 하여, 게터/세터 메소드를 작성하지 않아도 된다.
annotationProcessor 에 의해 컴파일 시점에서 @Getter @Setter 어노테이션이 달린 클래스에
게터/세터 메소드를 생성해주고 컴파일을 완료한다.
그러므로 compileOnly, annotationProcessor 를 사용하는 것이다.
외우지말고 이해하면 편하다 ㅎㅎ..
롬복으로 Getter, Setter, 생성자 만들기
package com.study.board.answer;
import java.time.LocalDateTime;
import java.util.Set;
import com.study.board.question.Question;
import com.study.board.siteUser.SiteUser;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.ManyToOne;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Entity
public class Answer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(columnDefinition = "TEXT")
private String content;
private LocalDateTime writeDate;
private LocalDateTime modifyDate;
@ManyToOne
private Question question;
//ManyToOne : 많은 Quesetion들을 한사람이 작성할 수 있음 (글쓴이 한 사람이 질문 여러개 등록)
@ManyToOne
private SiteUser user;
@ManyToMany
Set<SiteUser> voter;
}
위 코드는 Answer의 DTO를 작성한 자바 파일이다.
Answer class에 @Getter , @Setter 선언을 했다.
위 어노테이션 덕분에 게터/세터 메소드를 직접 작성하지 않아도 사용할 수 있게 된다. (코드상으로는 보이지 않음)
package com.study.board.answer;
import java.time.LocalDateTime;
import org.springframework.stereotype.Service;
import com.study.board.DataNotFoundException;
import com.study.board.question.Question;
import com.study.board.siteUser.SiteUser;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Service
public class AnswerService {
private final AnswerRepository answerRepository;
public Answer create(Question question, String content, SiteUser user) {
Answer answer = new Answer();
answer.setContent(content);
answer.setWriteDate(LocalDateTime.now());
answer.setQuestion(question);
answer.setUser(user);
this.answerRepository.save(answer);
return answer;
}
}
위 코드는 AnswerService 를 작성한 파일이다.
create 메소드는 답변(Answer) 의 "내용, 날짜, 답변작성자(SiteUser), 원글정보(Question)" 등의 내용을 담아 save 한다.
AnswerService class 에 @RequredArgsConstructor 선언을 했다.
이 어노테이션은 final 이나 @NotNull 속성이 붙은 필드의 생성자를 생성해준다. (@NotNull은 롬복의 어노테이션)
생성자 어노테이션과 final 선언에 의해 AnswerRepository 가 생성자 주입되었고,
이로 인해 this.answerRepository.save(answer); 로 사용할 수 있다.
@RequredArgsConstructor 어노테이션을 사용하는 곳은 주로 다음과 같다.
- 컨트롤러 : 컨트롤러에서 서비스를 호출하므로, 서비스 클래스 생성자 필요함
- 서비스 : 서비스에서 레포지토리를 호출하므로, 레포지토리 클래스 생성자 필요함
생성자 어노테이션에 대한 설명은 아래 링크를 참고해보자.. (공부 필요)
https://pamyferret.tistory.com/32
'점프투스프링부트(스프링부트+JPA)' 카테고리의 다른 글
2장 2-05 요약 (리포지터리 생성 방법, JUnit 설치와 테스트 코드 작성, 리포지터리 메서드명 작성 규칙, JUnit 에서 발생하는 지연 방식과 즉시 방식) (0) | 2024.12.13 |
---|---|
2장 2-04 요약 (데이터베이스와 엔티티, 엔티티 코드 리뷰) (3) | 2024.12.13 |
2장 2-03 요약 (ORM 개념, JPA 개념, H2 데이터베이스 설치와 환경설정, JPA 환경설정) (1) | 2024.12.12 |
2장 2-01, 2-02 요약 (프로젝트 구조, 컨트롤러, @ResposeBody) (0) | 2024.12.11 |
1장 스프링부트 개발 준비하기 1-01, 1-02 요약 (스프링부트 개념, 개발환경 준비, 프로젝트 생성) (2) | 2024.12.10 |