✏️ @Autowired: 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어줌 / 생성자가 1개만 있으면 생략 가능
‼️@Autowired를 통한 DI는 helloController, memberService 등과 같이 스프링이 관리하는 객체에서만 동작, 스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않음
package hello.hello_spring.controller;
import hello.hello_spring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
➡️ 이렇게 객체 의존관계를 외부에서 넣어주는 것을 DI (Dependency Injection)
이전 테스트에서는 개발자가 직접 주입했고, 여기서는 @Autowired를 통해 스프링이 주입해줌
컴포넌트 스캔 원리
@Component 애노테이션이 있으면 스프링 빈으로 자동 등록
@Component를 포함하는 애노테이션
@Controller
@Service
@Repository
회원 서비스 스프링 빈 등록
@Service
public class MemberService {
private final MemberRepository memberRepository;
// 외부에서 memberRepository를 넣어주도록 변경
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
회원 리포지토리 스프링 빈 등록
@Repository
public class MemoryMemberRepository implements MemberRepository{
스프링 빈 등록 이미지
memberService 와 memberRepository 가 스프링 컨테이너에 스프링 빈으로 등록
스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록(유일하게 하나만 등록해서 공유) ➡️ 같은 스프링 빈이면 모두 같은 인스턴스
설정으로 싱글톤이 아니게 설정할 수 있지만, 특별한 경우를 제외하면 대부분 싱글톤을 사용
2. 자바 코드로 직접 스프링 빈 등록
회원 서비스와 회원 리포지토리의 @Service, @Repository, @Autowired 애노테이션 제거하고 진행
java>hello.hello_spring>SpringConfig.java 생성
package hello.hello_spring;
import hello.hello_spring.repository.MemoryMemberRepository;
import hello.hello_spring.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemoryMemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
✔️ 실무에서 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용
✔️ 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈으로 등록
- 웹 브라우저에서 주소를 입력하면 내장 톰캣 서버에서 요청을 받고, hello-static.html의 요청이 왔다고 스프링 부트한테 넘김
- 스프링 부트는 먼저 컨트롤러에서 hello-static 찾음
- 없으면 resources/static 에서 hello-static.html 찾아서 웹 브라우저에 반환
MVC와 템플릿 엔진
MVC: Model, View, Controller
Controller - helloController.java 에 추가
@Controller
public class HelloController {
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
}
Group - 기업명, 기업 도메인명 / Artifact - 빌드되면 나오는 결과물 = 프로젝트명
GENERATE > 압축 파일 풀기 > IntelliJ에서 파일 Open
프로젝트 실행 및 빌드
동작 확인
기본 메인 클래스 실행 - @SpringBootApplication: 스프링부트 애노테이션으로 톰캣이라는 웹서버를 내장하고 있어서 스트링부트 실행 - 스프링부트 스타터 사이트에서 프로젝트를 생성하면 @SpringBootApplication 이 작성된 상태로 프로젝트가 생성됨
실행 로그에서 Tomcat 실행 확인 가능
http://localhost:8080로 이동하여 에러페이지로 간단하게 동작 확인
✚ IntelliJ로 자바 직접 실행
Gradle을 통해 실행하는 것이 기본 설정인데 이렇게 하면 실행속도가 느리므로 변경해주기
preferences > gradle > Build and run using, Run tests using -> IntelliJ IDEA 로 설정
✚ 라이브러리 살펴보기
Gradle은 의존관계가 있는 라이브러리를 함께 다운로드
스프링부트 라이브러리
spring-boot-starter-web
spring-boot-starter-tomcat: 톰캣(웹서버)
spring-webmvc: 스프링 웹 MVC
spring-boot-starter-thymeleaf: 타임리프 템플릿 엔진(View)
spring-boot-starter(공통): 스프링 부트 + 스프링 코어 + 로깅
spring-boot
spring-core
spring-boot-starter-logging (로그로 출력해야 로그파일이 관리가 됨(심각한 에러 등))
그 동안은 H2를 사용했기 때문에, 서비스를 내렸다 올리면 모든 데이터가 초기화되었음 ➡️ 데이터를 클라우드에 저장하여 서비스를 껐다 켜도 데이터가 유지되도록 함
AWS EC2에 배포
누구나 서비스에 접속할 수 있게 하려면 원격으로 항상 작동하는 컴퓨터 필요
도메인 붙이고 카카오톡으로 공유하기
OG 태그: 카카오톡으로 링크를 공유할 때, 자동으로 이미지, 제목, 내용을 가져오게 함
AWS RDS 구매하고 MySQL 세팅하기
RDS 구매하기
AWS에 접속하여 RDS 검색
데이터베이스 생성 > 표준 생성 > MySQL > 프리 티어 선택
설정 입력 - DB 인스턴스 식별자: 원하는 이름 작성 / 마스터 사용자 이름, 암호: DB 접속용으로 만들고 싶은 계정의 아이디, 비밀번호
DB 인스턴스 크기, 스토리지 설정 그대로
연결 > 추가 연결 구성 탭 클릭 후 다음과 같이 설정 - 퍼블릭 액세스 기능: "예" (이 설저이 되어 있어야 MySQL 연결 가능) - VPC 보안 그룹: "새로 생성" - 새 VPC 보안 그룹 이름: sprinboot-db-security - 가용 영역: 옵션 중 아무거나
추가 구성 > 초기 데이터베이스 이름에 "myselectshop" 입력 후 데이터베이스 생성 클릭
RDS 포트 열어주기
생성한 데이터베이스 클릭 > 연결 & 보안 > 보안 > VPC 보안 그룹의 springboot-db-security > 보안 그룹 ID 클릭
인바인드 규칙 편집 > 소스 > 위치 무관 -> 0.0.0.0, :/0 생성 후 "규칙 저장" 클릭
IntelliJ에서 확인
RDS 앤드포인트 확인 후 드래그하여 복사
<나만의 셀렉샵> 프로젝트 열기 > 우측 Database 탭 > Data Source > MySQL - Name: 생성한 데이터베이스 이름 - Host: 앤드포인트 - User: Username - Password: 비밀번호 - Database: myselectshop
- 다른 컴퓨터에 접속할 때 사용하는 프로그램으로 다른 프로그램보다 보안이 상대적으로 뛰어남
- 접속할 컴퓨터의 22번 포트가 열려있어야 접속 가능
- AWS EC2의 경우 이미 22번 포트가 열려있음
리눅스 명령어
ls: 내 위치의 모든 파일을 보여줌
pwd: 내 위치(폴더의 경로)를 알려줌
mkdir: 내 위치 아래에 폴더 하나 생성
cd [이동할 곳]: [이동랗 곳] 폴더로 이동
cd ..: 상위 폴더로 이동
cp -r [복사할 것] [붙여넣기 할 것]: 복사 붙여넣기
rm -rf: 삭제
sudo [실행할 명령어]: 관리자 권한으로 명령어 실행
sudo su: 관리가 권한으로 들어감 (나올 땐 exit)