23.12.20
김영한 인프런강의 보면서 공부했던 기록들 노션에서 옮겨둡니다!
[ 프로젝트 환경설정 ]
기본 IDS는 JetBrain intelliJ ultimate( 유료버전 )
- 프로젝트 파일 생성( spring.start.io )
- Gradle 전체 설정( build.gradle )
- plugins
- sourceCompatibility : java version
- repositories : 라이브러리 자동적으로 다운로드 받는 곳 지정( 기본 mavenCentral() )
- dependencies : 의존성 라이브러리들
- spring-boot-starter-thymeleaf, spring-boot-starter-web, spring-boot-starter-test등..
- gitignore : git을 이용하는 경우 필요한 소스코드파일만 올라가고 빌드된 결과물 등은 배제된다.
⇒ 동작확인( http://localhost:8080 )
Tomcat started on port(s): 8080 (http) with context path ( springboot에 내장 웹서버 톰캣으로 실행되는 것을 확인 할 수 있다..)
** 인텔리제이 자바 실행 : 인텔리제이는 Gradle을 통해서 실행하는 것이 기본설정이지만 빠른 실행을 위해 자바로 변경( Build and run using, Run test using 설정 )
프로젝트 JDK 설정, gradle JDK 설정 선행확인 필수!!
2. 스프링부트 라이브러리
Gradle을 이용하여 의존관계가 있는 라이브러리를 함께 다운로드할 수 있다.
- spring-boot-starter(공통) : 스프링부트 + 스프링코어 + 로깅
- spring-boot-starter-web
- spring-boot-starter-tomcat : 내장웹서버 톰캣
- spring-webmvc : 스프링웹 MVC
- spring-boot-starter-thymeleaf : 타임리프 템플릿 엔진(view)
- spring-boot-starter-logging ⇒ logback, slf4j
- spring-boot-starter-test(테스트 라이브러리) : junit, mockito, assertj, spring-test
- spring-boot-starter-web
3. 빌드하고 실행하기
(1) 해당 프로젝트 경로로 이동
(2) gradlew build ( gradlew.bat 를 실행 )
(3) build파일이 새로 생성 —> 그 안의 libs로 이동 —> jar파일 생성
(4) java -jar 명령으로 자바파일 실행
[ 스프링 웹 개발 기초 ]
기본적으로 3가지 컨텐츠 방식
-
- 정적 컨텐츠
- MVC와 템플릿엔진 = MVC패턴의 view : 서버의 프로그래밍을 통해 동적으로 HTML을 랜더링하여 전달( JSP, PHP, 타임리프)
- API : json이라는 데이터 구조포맷으로 데이터를 전달( HTML을 이용X ), 데이터만 전달하면 화면을 클라이언트에서 구성 / 서버끼리 통신하는 경우
- 정적 컨텐츠
- 내장서버에 요청전달
- 컨테이너에서 관련 컨트롤러(매핑된 컨트롤러)가 존재하는지부터 확인 ( 컨트롤러가 우선순위를 가진다 )
- 없다면 static 내부의 html을 찾아서 반환해준다.
=> 기본적으로 스프링부트는 정적페이지는 /static에서 찾아서 제공한다.( url은 파일명.html 그대로 )
- MVC와 템플릿엔진 : JSP방식으로 Controller와 View를 함께 사용할수도 있다..( 내부 로직처리 )
=> 관심사와 책임을 분리해야한다!! MVC 패턴으로 로직과 화면을 분리하기
-
- 웹브라우저 요청
- 내장 서버가 받음 -> 매칭된 컨트롤러의 메서드가 처리됨
- 컨트롤러의 반환값을 view resolver가 받아서 매핑, 템플릿엔진의 처리를 요청 / 기본 viewName 매핑 : resources:templates/ +{ViewName}+ .html
- 템플릿엔진의 랜더링으로 변환하여 반환
@RequestParam
- value : 속성명
- required : 반드시 값을 입력해야하는 속성, 기본 true
- API
- 요청
- 내장서버에서 매칭되는 컨트롤러 확인
- responsebody의 어노테이션의 확인=> HttpMessageConverter가 동작
- 단순문자인 경우 stirngconverter가 동작
- 객체인 경우 jsonconverter가 동작--> json 스타일로 객체를 변경 ( 라이브러리 이용 )
- 객체를 json으로 변환하는 라이브러리 -> jackson, Gson
- 이외에도 xml로 반환받고 싶으면 xmlconverter가 동작하게 만들 수 있다..
@Responsebody
: http통신의 바디부에 데이터를 직접 넣어주겠다는 뜻 / 매핑없이 데이터가 그자체로 전달된다.
viewResolver 대신에 HttpMessageConverter 가 동작 StringHttpMessageConverter → 그대로 반환 MappingJackson2HttpMessageConverter → 객체가 JSON으로 변환되어 반환
이외 다양한 Converter를 통해 다양한 형태로 반환
[ 백엔드 개발 ]
- 컨트롤러: 웹 MVC의 컨트롤러 역할
- 서비스: 핵심 비즈니스 로직 구현
- 리포지토리: 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리
- 도메인: 비즈니스 도메인 객체 (예) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨
repository의 처리는 저장소에 가깝고( save, find )
service의 처리는 비즈니스 로직에 가깝다.( join, findMember )
- 테스트 케이스의 작성 (Ctrl + shift + t) : 개발한 기능을 메인메서드가 아닌 JUnit 프레임워크로 실행한다.
- repository, service 객체 주입
- @AfterEach : 하나의 테스트케이스(메서드)가 종료될때마다 동작하는 코드 / 전체테스트시에 테스트케이스의 순서보장이 없으므로 공용데이터를 초기화하는데 이용된다. ( ex. 메모리 DB에 저장된 데이터의 삭제 )
- org.junit.jupiter.api.Assertions → assertEquals(대상, 비교대상)
- org.assertj.core.api.Assertions → assertThat(대상).isEqualTo(비교대상)
[ 내장서버와 컨테이너의 구분 및 흐름 ]
내장 서버 (Embedded Server):
- 역할: 내장 서버는 웹 애플리케이션을 실행하는 데 필요한 서버 기능을 포함하고 있는 애플리케이션 내부에 내장된 서버
- 패키징 및 배포: 애플리케이션을 패키징할 때 내장 서버가 함께 포함되어 있습니다. JAR 파일 또는 WAR 파일에 내장 서버가 포함되어 있어 애플리케이션을 간단히 실행
- 실행 환경: 애플리케이션을 실행하기 위해 별도의 외부 서버 설치가 필요하지 않습니다. 내장 서버는 애플리케이션을 실행하는 데 필요한 모든 것을 내장
컨테이너 (Servlet Container 또는 Web Container):
- 역할: 컨테이너는 웹 애플리케이션을 실행하고 관리하는 환경을 제공하는 소프트웨어입니다. Java에서는 주로 서블릿 컨테이너가 사용되며, 서블릿 및 JSP와 같은 웹 컴포넌트를 실행하고 관리
- 패키징 및 배포: 애플리케이션을 컨테이너에 배포하여 실행합니다. 컨테이너는 애플리케이션을 실행하기 위해 필요한 서버 환경을 제공하며, WAR 파일 등의 애플리케이션을 컨테이너에 배포
- 실행 환경: 컨테이너를 사용하려면 별도의 서버 환경이 필요합니다. 개발 및 테스트 환경에서는 별도의 서버를 설치하고 설정
⇒ 내장 서버와 컨테이너는 모두 웹 애플리케이션을 실행하고 클라이언트의 HTTP 요청에 대한 응답을 생성( 웹 애플리케이션의 동적 컨텐츠 생성을 담당하며, 클라이언트와의 상호작용을 지원 )
요청 → 내장서버 → 컨테이너의 컨트롤러에 매칭
컨트롤러의 return은 resources의 template에서의 페이지 ( 데이터를 가지고 가서 랜더링할 화면 )
페이지의 매칭은 viewrResolver가 자동으로 진행해준다..!!!!
[ 스프링빈과 의존관계 ]
- 컨테이너 : 어노테이션이 붙은 클래스의 객체를 생성해서 넣어둔다. + 관리
- 스프링 빈(Spring Bean) : 스프링 컨테이너에 의해 생성, 관리되고 조립되는 객체
- 스프링 컨테이너의 스프링 빈을 등록할 때, 기본적으로 싱글톤으로 등록한다
- 의존관계의 주입( dependency injection ) : 다른객체를 통해 작동(의존성)
( ex.Controller가 service객체를 통해서 작동 )
@Autowired
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired : 연관된 객체(@Component, @Bean)를 스프링 컨테이너에서 찾아서 넣어준다.
< 스프링빈 등록하는 2가지 방법 >
1. 컴포넌트 스캔과 자동 의존관계 설정
- @Controller :: 컨트롤러를 통해 외부요청을 받음
- @Service :: 서비스에서 비즈니스 로직을 만듬
- @Repository ::레포지토리에서 데이터를 저장
2. 자바코드로 직접 스프링 빈 등록하기 : @Configuration 클래스
@Bean
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
⇒ 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용
⇒ 상황에 따라 구현클래스를 변경해야하는 경우 스프링빈으로 등록
<DI 주입방식>
- 생성자를 통한 주입
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
- 필드를 통한 주입
@Controller
public class MemberController {
@Autowired
private final MemberService memberService;
}
- 설정자를 통한 주입
@Controller
public class MemberController {
private MemberService memberService;
@Autowired
public void setMemberService(MemberService memberService) {
this.memberService = memberService;
}
}
상황에 따라 구현클래스를 변경해야하는경우 ( @Repository 를 다른 것으로 변경, 나머지 코드와 서비스에 영향X )
[ 웹MVC 개발 ]
- 시작화면
기본 static/index.html이지만 홈컨트롤러의 getmapping(”/”)을 등록하면 해당페이지로 처리된다. ( 컨트롤러가 정적파일보다 우선순위가 높다. )
- GetMapping( value =”접속 url” )
- Model객체 : 반환경로로 처리한 데이터를 전달
- model.addAttribute( “전달명”, 값 );
- Model객체 : 반환경로로 처리한 데이터를 전달
get mapping : 데이터 조회
post mapping : 데이터를 넣어서 전달
⇒ 같은 url이라도 post, get방식이 다르면 다르게 처리할 수 있다.
+)
@SpringBootTest : 스프링을 올려서 진행하는 통합테스트( 자바테스트 아님 )
@Transactional : 테스트 시작전에 트랜잭션을 시작하고 테스트 완료후 무조건 롤백
[ 스프링 DB접근 기술 ]
< 환경설정 >
- build.gradle : 데이터베이스 라이브러리 / jdbc라이브러리 , data-jpa 라이브러리( jdbc포함 )
- 연결설정( resource폴더 내부 properties파일, yml파일 )
- spring.datasource의 url, driver-class-name, username 추가
- Datasource : 데이터베이스 커넥션을 획득할때 사용 / 커넥션정보를 바탕으로 스프링빈으로 생성되어 관리 → DI가능
- spring.jpa관련 설정
- spring.jpa.show-sql=true: JPA가 생성하는 SQL을 출력한다.
- spring.jpa.hibernate.ddl-auto=create : 엔티티정보를 바탕으로 테이블 자동생성 ( 시작전에 dr)
< 다양한 DB접근 기술 >
- JDBC API
- JDBC template, MyBatis : JDBC API의 반복코드 제거, SQL문을 직접작성
- JPA : 기본적인 SQL을 직접 만들어서 실행( 생산성 향상 )
JPA는 java 표준인터페이스 —> 여러 구현기술(vendor) 중 hibernate를 사용한다.. !!!!
ORM기술의 일종 : 객체(O)와 관계형데이터베이스(R)를 매핑한다. =⇒ annotation을 통해
- Domain에서 엔티티매핑
- @Entity : JPA가 관리하는 엔티티
- @Id : primary key
- @GeneratedValue(strategy = GenerationType.IDENTITY) : 자동증가 대체키로 설정
- @Column( name = “테이블 컬럼명” ) : 해당컬럼과 매핑
- JPARepository : 데이터베이스와의 상호 작용을 추상화하기 위한 인터페이스를 제공하는 모듈
- EntityManager 생성
- em.persist(엔티티객체) : 엔티티객체의 삽입(insert)
- em.find( 엔티티클래스, 식별자 ) : 엔티티객체의 조회(select)
- em.createQuery( “JPQL쿼리문”, 반환엔티티객체클래스 )
- em.createQuery( ”JPQL쿼리문” ).setParameter( “이름”, 값 ) — :param의 값 지정
- JPA를 이용하는 Service
- @Transactional : JPA의 엔티티매니저를 통한 데이터변경은 반드시 트랜잭션 내에서 이루어져야 함 ⇒ 정상종료시 커밋, 예외발생시 롤백 / 테스트환경에서는 무조건 롤백처리
[ AOP ]
: 공통관심사항과 핵심관심사항의 분리
@Aspect , @Component 로 객체 생성
@Around( “execution( 지정대상)” )
ProceedingJoinPoint joinPoint를 파라미터로 받음
컨트롤러가 프록시객체를 호출→ 실제객체를 호출해서 실행시킨다.( joinPoint.proceed() )
'web programming' 카테고리의 다른 글
[ 스프링 입문 ] 스프링 빈과 의존관계 (0) | 2024.09.02 |
---|---|
[ 스프링 입문 ] 회원관리 예제 (1) | 2024.09.02 |
[ 스프링 입문 ] 프로젝트 환경설정, 스프링 웹개발 기초 (1) | 2024.08.24 |
JPA(Java Persistence API) 기본개념 (0) | 2024.03.10 |
JQuery를 이용한 웹프론트 페이지 클론코딩 (0) | 2024.03.10 |