[Inflearn] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 정리✍️ 정리/Spring2024. 6. 28. 20:30
Table of Contents
📚 강의 출처
강사님께 항상 감사합니다. 🧑🏻💻
해당 글은 김영한님의 강의와 개인적 지식을 바탕으로 정리한 내용입니다.
모든 자료의 출처는 김영한 강사님임을 미리 밝힙니다.
섹션 2. 스프링 웹 개발 기초
- 스프링 부트 정적 컨텐츠 체험
<!DOCTYPE HTML>
<html>
<head>
<title>static content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>
- Spring Boot : '/hello-static.html' 접속 시 Tomcat 서버에서 컨트롤러 존재 여부 확인 후 정적 컨텐츠 반환
- MVC : M(model) V(view) C(controller)
- Spring Boot : '/hello-mvc' 접속 시 Tomcat 서버에서 컨트롤러 존재 여부 확인 후 정의된 내용에 따라 'hello-template' 반환
- @ResponseBody 활용 반환
@Controller
public class HelloController {
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello();
hello.setName(name);
return hello;
}
static class Hello {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
- Spring Boot :
- '/hello-string?name=spring' 접속 시 Tomcat 서버에서 컨트롤러 존재 여부 확인 후 내부 로직 실행
- @ResponseBody 어노테이션을 보고 HttpMessageConverter 동작
- 기본 문자 처리 : StringHttpMessageConverter
- 기본 객체 처리 : MappingJackson2HttpMessageConverter
- @ResponseBody 어노테이션을 보고 HttpMessageConverter 동작
- '/hello-string?name=spring' 접속 시 Tomcat 서버에서 컨트롤러 존재 여부 확인 후 내부 로직 실행
섹션 3. 회원 관리 예제 - 백엔드 개발
- 컨트롤러 : MVC 컨트롤러
- 서비스 : 핵심 비즈니스 로직
- 리포지토리 : DB 접근 및 도메인 객체를 저장하고 관리
- 도메인 : 비지니스 도메인 객체
- 반복 및 여러 테스트를 한 번에 실행하기 어려운 단점을 JUnit 테스트 프레임워크 사용
- @AfterEach : 여러 테스트 실행 중 각 테스트가 종료될 때마다 기능을 실행
- 테스트 설계 시 각각 독립적으로 실행 원칙 준수
public class MemberService {
private final MemberRepository memberRepository =
new MemoryMemberRepository();
}
public class MemberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
...
}
- 기존 Service 로직에서 강한 결합의 문제를 DI(Dependency injection) 의존성 주입 테크닉 방식으로 개선
- @BeforeEach : @AfterEach 반대로 각 테스트 실행 전 호출
섹션 4. 스프링 빈과 의존관계
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
- @Autowired : 생성자에 해당 어노테이션 선언 시 연관된 객체를 스프링 컨테이너에서 찾아서 삽입. 이처럼 의존관계를 외부에서 넣어주는 것을 DI(Dependency injection) 의존성 주입.
- 스프링 빈 등록 방법 2가지
- 컴포넌트 스캔과 자동 의존관계 설정
- Java 코드로 직접 스프링 빈 등록
- @Component : 스프링 빈 자동 등록
- @Controller 어노테이션이 자동으로 등록된 이유 = 내부에 @Component 스캔 방식이 적용
- @Controller 외에도 @Service @Repository 도 내부에 스캔 방식 적용으로 자동 등록
- Spring은 Spring 컨테이너에 스프링 빈을 등록할 때, 기본적으로 싱글톤 적용 = 같은 스프링 빈이면 모두 같은 인스턴스
- DI는 3가지 방식이 존재
- 필드 주입
- Setter 주입
- 생성자 주입
- 정형화되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 설정을 통해 스프링 빈 등록
- ex) 테스트 시 H2 DB, 운영 환경에서는 MySQL DB처럼 선택적으로 사용하는 경우
🧑🏻💻 강의 실습 기록
섹션 5. 회원 관리 예제 - 웹 MVC 개발
- 동일한 루트 URL에 대한 정적 HTML 파일이 존재해도, 컨트롤러 로직 우선적 적용
@PostMapping(value = "/members/new")
public String create(MemberForm form) {
Member member = new Member();
member.setName(form.getName());
memberService.join(member);
return "redirect:/";
}
- "redirect:/" : 데이터 처리를 마친 후 사용자를 루트 URL로 리다렉션
@GetMapping(value = "/members")
public String list(Model model) {
List<Member> members = memberService.findMembers();
model.addAttribute("members", members);
return "members/memberList";
}
...
<tr th:each="member : ${members}">
<td th:text="${member.id}"></td>
<td th:text="${member.name}"></td>
</tr>
- model.addAttribute로 추가된 members 리스트는 다음과 같이 표시
🧑🏻💻 강의 실습 기록
섹션 6. 스프링 DB 접근 기술
- H2 DB : 자바로 작성된 관계형 데이터베이스 관리 시스템(RDBMS) 툴 기반 학습
- JDBC : 과거에 사용했던, 데이터베이스에 접근하고 조작할 수 있도록 해주는 API
- DataSource : 데이터베이스와의 연결을 위한 Java의 표준 인터페이스
- 개방-폐쇄 원칙(OCP, Open-Closed Principle) : 확장에는 열려있고. 수정 및 변경에는 닫힘
- 확장은 OPEN? : 새로운 기능이나 요구사항을 추가할 수 있도록 설계가 유연, 기존 코드를 수정하지 않고 확장 가능
- 수정 및 변경은 Close? : 기능을 추가하거나 변경할 때 기존 코드를 수정 X
- 스프링의 DI(Dependency injection) 사용 시 기존 코드는 수정하지 않고, 설정만으로 클래스 변경
- @SpringBootTest : 스프링 컨테니어와 테스를 함께 실행
- @Transactional : 테스트 케이스 적용 시, 시작 전 트랜잭션 시작. 테스트 완료 후 롤백
- JDBC Template : JDBC와 동일한 환경설정, JDBC API에서 반복 코드를 어느 정도 제거해 간소화한 템플릿
- JPA : 기존 JDBC 반복 코드와 직접 작성해야 했던 SQL문도 직접 만들어서 실행, 개발 생산성을 크게 향상
- application.properties
- show-sql : JPA가 생성하는 SQL 출력
- ddl-auto : 테이블을 자동 생성 기능 제공
- application.properties
- JPA를 통한 데이터 변경은 트랜잭션 안에서 실행
- JPA 제공 기능
- 인터페이스를 통한 기본적인 CRUD
- 메서드 이름 만으로 다양한 기능 제공
- 페이징 기능 자동 제공
🧑🏻💻 강의 실습 기록
섹션 7. AOP
- AOP(Aspect Oriented Programming) : 공통 관심 사항을 모듈화 하는 프로그래밍 패러다임
- ex) 공통 관심 사항 = 프로그램 로직 실행 시간 분석
- Proxy : 실제 객체를 대신하여 작동하는 대리 객체
🧑🏻💻 강의 실습 기록
'✍️ 정리 > Spring' 카테고리의 다른 글
[Inflearn] 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 정리 (B) (0) | 2024.08.06 |
---|---|
[Inflearn] 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 정리 (A) (0) | 2024.07.31 |
[Inflearn] 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 정리 (B) (3) | 2024.07.24 |
[Inflearn] 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 정리 (A) (0) | 2024.07.18 |
[Inflearn] 모든 개발자를 위한 HTTP 웹 기본 지식 정리 (2) | 2024.07.03 |
@택이✌️ :: Code::택이
Backend 개발자를 꿈꾸는 꿈나무💭 기술 블로그
꾸준함을 목표로 하는 꿈나무 개발자 택이✌️입니다. 궁금하신 점이나 잘못된 정보가 있으면 언제든지 연락주세요. 📩 함께 프로젝트 및 스터디도 언제든지 희망합니다! 📖