| 어노테이션 | 설명 |
|---|---|
@Component | 객체(컴포넌트)를 나타내는 일반적인 타입으로 <bean> 태그와 동일한 역할 |
@Repository | 퍼시스턴스(persistence) 레이어, 영속성을 가지는 속성(파일, DB)을 가진 클래스 |
| ex) Data Access Object Class | |
@Service | 서비스 레이어, 비즈니스 로직을 가진 클래스 |
| ex) Service Class | |
@Controller | 프레젠테이션 레이어, 웹 애플리케이션에서 View에 전달될 웹 요청과 응답을 처리하는 클래스 |
| ex) Controller Class |
| 어노테이션 | 설명 |
|---|---|
@Autowired | - 정밀한 의존 관계 주입(DI)이 필요한 경우 사용 |
<property>, <constructor-arg>와 동일한 역할 |@Qualifier | - @Autowired와 함께 사용@Qualifier("이름")로 특정 객체를 지정하여 주입 가능 || 구성 요소 | 설명 |
|---|---|
| DispatcherServlet | 클라이언트 요청을 받아 적절한 컨트롤러에 전달하고, 컨트롤러의 처리 결과를 View에 전달하여 응답 생성 |
| HandlerMapping | 요청 URL에 따라 어떤 컨트롤러가 처리할지 결정 |
| Controller | 클라이언트 요청을 실제로 처리하고 결과를 DispatcherServlet에 반환 |
| ModelAndView | 컨트롤러가 반환하는 객체로, 처리 결과 데이터(Model)와 뷰(View) 정보를 함께 포함 |
| ViewResolver | ModelAndView의 View 이름을 기반으로 실제 View(JSP 등)를 결정 |
| View | 최종적으로 사용자에게 보여질 화면을 생성 (JSP, Thymeleaf, Velocity 등) |
src/main/java : 자바 소스 코드를 모아두는 폴더파일이름Application.java : 프로젝트 생성 시 자동 생성src/main/resources : 자바에서 사용할 자원, 설정 파일을 모아두는 폴더templates : Java 템플릿을 모아두는 폴더 (Thymeleaf)static : templates에 적용될 정적 자원을 모아두는 폴더 (JS, CSS, 이미지)application.properties : Spring Boot 프로젝트 관련 설정을 정의하는 파일 (중요)Project and External Dependencies : build.gradle에 명시된 라이브러리 모음build.gradleapplication.properties# 해당 파일에 설정 작성 시 프로젝트 전반적으로 설정이 적용됨
#애플리케이션(프로그램) 이름
spring.application.name=demoProject1
# port번호 80으로 변경(80은 HTTP의 기본 포트번호로, 브라우저에서 포트번호 없이 접속 가능)
server.port=80
# Spring DevTools (자동 리로드 서버 재시작) 설정
# 브라우저 자동 새로 고침 기능
spring.devtools.livereload.enabled=true
# 코드 변경 시 서버 자동 재시작
spring.devtools.restart.enabled=true
# 타임리프 캐시 비활성화 (HTML 파일 수정 시 바로 변경사항 확인할 수 있도록)
spring.thymeleaf.cache=false
# 로그 레벨 지정
logging.level.edu.kh.demo=debug
# 로그레벨 6단계
# TRACE : 가장 상세한 로그레벨로, 상세한 정보를 기록
# DEBUG : 디버깅에 유용한 정보를 기록(값 추적)
# INFO : 일반적인 정보 메시지 기록 ( Spring boot에서 자동으로 기본 레벨 INFO)
# WARN : 경고 메시지를 기록
# ERROR : 오류 메시지를 기록, 심각한 문제 발생 시 사용
# FATAL : 가장 심각한 오류, 프로그램 실행 중단의 치명적 오류 기록
build.gradledependencies{} : 외부 연결된 사이트 (MVNrepository)plugins {
id 'java'
id 'org.springframework.boot' version '3.4.4'
id 'io.spring.dependency-management' version '1.1.7'
}
group = 'edu.kh'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
// 외부 연결된 사이트 (MVNrepository)
// 아래에 작성된 모듈, 라이브러리를 다운로드 받아서 프로젝트에 자동으로 추가
// 아래 dependencies 괄호 안 부분 수정 시 저장 후
// 프로젝트 우클릭 -> Gradle -> Refresh Gradle Project 클릭
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
/*
* Controller 메서드의 반환형이 String인 이유
* -> 메서드에서 반환되는 문자열이
* forward할 html 파일의 경로가 되기 때문
*
* Thymeleaf : JSP 대신 사용하는 템플릿 엔진(html 형태)
*
* classpath = sre/nain/resources
* 접두사 : classpath:/templates/
* 접미사 : .html
*
*/
// src/main/resources/templates/test.html
return "test"; // 접두사 + 반환값 + 접미사 경로의 html로 forward
// - 공통 주소를 매핑
// ex) /todo/insert, /todo/select, /todo/update ...
@RequestMapping("/todo")
public class TestConstroller {
@RequestMapping("/insert")
public String 메서드명() {}
@RequestMapping("/insert")
public String 메서드명() {}
@RequestMapping("/insert")
public String 메서드명() {}
}
@SpringBootApplication@Controller@GetMapping("주소") : 요청 시 호출@PostMapping@PutMapping@DeleteMapping@RequestMapping("주소")요청 주소를 처리할 메서드를 매핑하는 어노테이션
GET/POST 가리지 않고 매핑 -> (속성을 통해서 지정 가능 or 다른 어노테이션 이용)
@RequestMapping(value="test", method = RequestMethod.GET)
@RequestMapping("test") // /test 요청 시 testMethod가 매핑하여 처리함
@Slf4j : log.debug() 사용 가능 (Lombok 기능)log를 이용한 메시지 콘솔창에 출력할 때 사용(Lombok 제공)
@Slf4j
public class logTest(){
log.debug("inputName : " + inputName);
}