자바풀스택 과정/자바 풀 스택 : 수업내용정리

자바 풀 스택 2/14 하루 기록 055

파티피플지선 2025. 2. 14. 18:08

9:15경 학원 도착

 


<9:30 1교시>

오늘 스프링 부트 시작 설정한다고 했었던거 같음

 

https://maven.apache.org/

 

Welcome to Apache Maven – Maven

Welcome to Apache Maven Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information. If you

maven.apache.org

 

자바로 만들다가 외부 라이브러리 jar 파일이 필요한 경우가 많은데 이걸 다 WEB-INF넣고 썼었는데,

이렇게 라이브러리를 계속 찾아다 쓰는건 힘들다.

왜냐하면 개수도 많고 버전도 계속 업데이트 되고 그래서.

 

우리는 Maven을 써서 이런 번거로움을 해소해보려고 함.

이클립스에 내장되어 있긴 하지만 우리 컴퓨터에도 설치해보려고 함.

 

 

 

 

C드라이브에다가 붙여넣기

 

bin 폴더에 실행파일이 있다.

 

 

현재는 mvn을 어떤 경로에서나 실행할 수 있는 상태가 아니다. 즉, CMD 창에서 mvn을 쳐도 사용할 수가 없다.

환경 설정을 통해서 mvn이 아무데서나 실행될 수 있도록 설정할 수 있다.

 

환경변수에다가 모든 환경 변수에서 mvn을 실행될 수 있게 할 수 있다.

검색에서 환경을 검색해서 환경변수 편집창을 열고

 

 

C:\apache-maven-3.9.9 이 경로를 복사해서 이 경로의 bin 폴더의 mvn 실행파일이 어디서든 실행될 수 있도록 입력할 것이다.

 

 

이 경로를 참조할 때는 

%MAVEN_HOME%를 입력해서 참조할 수 있다.

환경변수 편집 창에 메이븐을 등록해줘야 한다.

왜냐하면 cmd 창에서 프로그램을 입력했을 때 실행이 되려면 환경 변수에 등록되어서 cmd 창에 명령이 입력되었을 때 모든 환경변수를 돌아보면서 해당 프로그램의 경로가 존재하는지 확인을 하게 되는데,(이를테면 아래의 자바의 경우)

 

mvn을 실행하기 위해서도 이렇게 환경변수를 등록해서 실행할 수 있게 해줘야함.

 

 

이제 실행됨.  mvn --version이라고 입력해야 함

 

 

Eclipse > Help> Eclipse Marketplace에서 스프링 관련 플러그인 설치

Spring 뜻 뭐냐고 그래서 난 용수철이라고 했다...ㅋㅋㅋㅋㅋㅋㅋㅋ

봄이라네. 코딩계의 봄이 찾아왔다 뭐 그런 의미인가. 아무튼 개편리한가봄.

 

 

 

Confirm 동의 next next 등등.... 설치 옵션들은 디폴트 값으로 하다가 

trust authorities 나타나면 Select All 하고 Always trust all authroities Yes I Accept the Risk 하고 Trust Selected 누름.

 

 

 

 


 

<10:30 2교시>

프로젝트를 만들고 나면 기능을 추가하거나 수정하거나 유지 보수하는 상황들이 발생하게 된다.

 

예를 들어 PostDto를 수정할 일이 생겼다. 이를테면 필드명을 수정하면 그 필드명을 사용하던 관련 모든 페이지들이 다 수정되어야 하는데, 수정을 하면 그 여파가 모든 프로젝트로 퍼지게 된다.

 

규모가 큰 프로젝트면 이렇게 클래스를 수정해서 유지보수하는 일이 굉장히 힘든일이 될 수 있다.

 

그래서 이런 문제점을 해결하고자 등장한 게 스프링이다. 

 

객체 지향 프로그래밍에서는 객체 간에 서로 의존 관계가 발생하게 되는데, 이런 의존 관계를 좀 느슨하게 만들어서 의존 관계가 줄어들면 수정하는 여파가 퍼지는 게 줄어든다. 

 

스프링은 그 의존관계를 줄어들게 해주는 역할이다. 

의존 관계를 줄이느라 코딩 양은 증가할 수도 있긴 하지만 유지 보수 관점에서 훨씬 유리해서 사용한다고 한다.

 

 


의존 관계를 느슨하게 만드는 방법의 원칙이 존재한다.

1. 핵심 의존 객체를 직접 new (생성) 하지 않는다.

    예를 들어 Dao 객체 같은 경우, Dao dao = new Dao()하지 않는다.

    객체 생성과 관리를 Spring 프레임워크에게 맡긴다.

2. 필요한 핵심 객체가 있다면 Spring 프레임 워크로부터 주입(Injection) 받아서 사용한다.

    의존성 주입 Dependency Injection => DI

3. 의존 객체를 주로 Interface type으로 받아서 사용한다.

    예를 들어 클래스가 아래와 같을 때,

    publiuc   class  MemberDaoImpl  implements MemberDao{

       

    }

    

    위의 클래스로 생성한 객체를 활용할 때는 MemberDao type으로 받아서 사용해야 한다.

 

    MemberDaoImpl dao1    ( X )    -> 클래스에 의존하게 되는 상황이다.

    MemberDao dao2           ( O )    -> 클래스에 의존하지 않고 인터페이스를 사용한다.

 

스프링 프레임워크야 필요한 객체 생성이랑 관리를 너가 맡고 있다가 내가 객체를 활용하면 이걸 가져다 줘.

 

우리 쓰던 bean을 콩 하나를 객체라고 보고, 스프링프레임워크에게 이 콩을 맡기고 관리하게 함.

스프링 프레임워크가 이렇게 빈들을 넣어두는 공간을 Spring Bean Container라고 함.

관리하고 있다가 필요한 시점에 주입해줌. 그럼 이 주입된 객체를 사용하게 됨.

 

핵심 객체를 내가 new 해서 받아오는게 아니라 스프링이 주입해줬겠지 라고 기대하고 그냥 사용.

 

의존 관계가 느슨해진다는거, 하나를 수정했을 때 그 여파가 전파되지 않는다는 것.

 

인터페이스를 만들어서 객체 생성과 관리를 맡겨 놓고 이걸 implement 해서 활용할 것임.


 

 

 

 

 

 

pom.xml : 여기에 사용할 의존 패키지 전체를 담아 둔다.

 

 

src/main/java에 들어가면 자동으로 생성된 Application 클래스가 하나 있다.

우리가 보던 클래스인데, 처음보는 어노테이션과 처음보는 한 줄의 코드가 같이 있다.

 

 

그 패키지에 하위 패키지를 만들고

 

방금 만든 하위 패키지에 interface를 생성한다.

 

인터페이스를 구현한 클래스를 만든다.

 

만약에 이런식으로 코딩하면 Spring 의 원칙을 어긴 것이기 때문에 의존성이 생겨버린다.

실행은 되지만 스프링의 원칙을 어겨서 이 상황의 코드는 의존성이 발생해 버린 상황이어서 다음 교시에 이어서 인터페이스로 의존성을 줄이는 방법을 알아보기로 한다.

 

 


<11:30 3교시>

스프링에서는 @를 많이 활용할 것이다. 

 

@Component의 의미는 @SpringBootApplication이 붙어 있는 애가 있는 패키지의 하위 패키지를 모두 스캔하고, 스프링 프레임워크가 알아서 그 컴포넌트들을 생성하라는 의미. 여기서 생성된 객체의 참조값들이 Spring Bean Container에서 관리하게 된다.

그러니까 @Component가 붙어 있는 클래스들은 Spring Bean(객체)이 되어 버린다.

컴포넌트 스캔이 일어나는 패키지에다가 인터페이스와 클래스들을 만들어 놓고 적절한 어노테이션만 붙여놓으면 스프링이 알아서 객체를 생성해서 관리한다.



 

 

 

run()메소드가 리턴하는 객체를 Spring Bean Container라고 생각하면 된다.

 

 

HomeServiceImpl 클래스에 직접적인 의존 관계가 없이, 스프링에 의해 생성된 HomeService 타입 인터페이스의 객체를 받아서 쓰는 것.

그래서 이 경우 HomeServiceImpl 객체를 삭제해도 영향이 없다.

다만, HomeService 인터페이스를 삭제하면 영향을 받는다.

메소드에 붙는 어노테이션 PostConstruct 가 붙으면, 실행했을 때 필드에 객체가 @Autowired로 자동 주입이 되고, PostConstruct 붙은 메소드가 실행된다.

즉, 이 클래스로 객체가 생성된 이후 바로 호출하고 싶은 메소드에 @PostConstruct 메소드를 붙여 놓으면 된다는 의미.

 

 

Spring Bean 에 담긴 객체들 간의 의존성을 확인해보기 위한 예제.

 

 

Drill 인터페이스를 만들고

 

 

DrillImpl 클래스를 만들어서 

 

 

HomeServiceImpl에 Drill 객체의 의존성을 주입받아서 필드를 생성하고 주입 받은 객체를 사용하여 drill.hole() 메소드를 호출할 수 있다.

 

앱의 @PostConstruct 부분에 추가해보면 실행된다.

 

 

 

<12:30 4교시>

오늘 했던거 되짚어 보기!

 

 

핵심 : 의존도 없이 주입 받고, 주입 받은 객체에서 원하는 기능을 수행한다.

@SpringBootApplication이 달려 있는 Application 클래스는 자동으로 생성된다.

@Component는 Component Scan으로 Spring Bean Container에 들어갈 녀석들을 표시해주고, 이녀석들은 인터페이스를 구현한 클래스들에 붙여준다.

@Autowired는 Spring Bean Container 안에 있는 객체 중에서 필요한 객체가 있다면 필드로 선언해두고, @Autowired를 붙여서 연결한 필드에 해당 객체를 주입한다.

@PostConstruct 실행했을 때 @Autowired로 필드에 객체가 자동으로 주입되면서 객체가 생성됨과 동시에 @PostConstruct가 붙은 메소드가 실행된다.

더보기

코드

Spring01HelloApplication.java

package com.example.spring01;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

import com.example.spring01.service.HomeService;

import jakarta.annotation.PostConstruct;
/*
 * 	@SpringBootApplication 어노테이션이 많은 기능을 하는데, 그 중 하나는 이 클래스(Spring01HelloApplication)클래스로 객체를 생성해서 관리를 해주는 것.
 *  이 아래의 클래스로도 생성자 선언 없이 객체가 생성되어 있다는 것.
 */
@SpringBootApplication
public class Spring01HelloApplication {

	
	//Spring01HelloApplication 객체 안에서 필요한 객체가 있다면 필드로 선언해두고, 스프링빈컨테이너로부터 @Autowired 어노테이션을 붙여놓은 필드에 해당 객체가 주입(DI)된다.
	@Autowired
	HomeService service;
	
	//메소드에 붙는 어노테이션 PostConstruct 가 붙으면, 실행했을 때 필드에 객체가 @Autowired로 자동 주입이 되고, PostConstruct 붙은 메소드가 실행된다.
	@PostConstruct
	public void exec() {
		System.out.println("생성 후 exec()메소드 호출됨");
		service.clean("나");
		service.wash("우리들");
		service.hole("벽");
		
	}
	
	public static void main(String[] args) {
		//run()메소드가 리턴하는 객체(이 객체를 Spring Bean Container라고 생각하면 된다)
		ApplicationContext context = SpringApplication.run(Spring01HelloApplication.class, args);
		
		
		//"이름1"의 집을 청소해야 한다면 어떻게 해야 할까? 일단은 HomeServiceImpl 객체가 필요한데, 늘 하던대로 
		//HomeServiceImpl service1= new HomeServiceImpl();
		//service1.clean("이름1");
		
		//@Component를 함으로써 Spring이 생성하고 관리하는 객체 중 HomeService 타입(인터페이스 타입)의 객체를 getBean()하고 변수에 담는다
	    HomeService service2 = context.getBean(HomeService.class);
	    service2.clean("이름2");
		
	}

}

 

 

HomeService.java(인터페이스)

package com.example.spring01.service;

public interface HomeService {
	public void clean(String name);//청소하는 메소드
	public void wash(String name);//빨래하는 메소드
	public void hole(String name);//구멍뚫는 메소드
}

 

 

 

HomeSerivceImpl.java(클래스)

package com.example.spring01.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/*
 * 스프링 프레임워크가 HomeServiceImpl클래스가 존재하는 패키지(com.example.spring01.service)를
 * component scan 을 하게 되면 이 클래스로 객체를 생성해서 ㅇ해당 객체의 참조값을 spring bean container에서 관리하게 된다.
 *  - 그렇다면 도대체 어디를 scan 하게 되나?
 *  @SpringBootApplication어노테이션이 붙어있는 클래스가 존재하는 패키지 혹은 하위 패키지를 모두 scan해서 main() 메소드가 존재하는지를 찾는다. 
 */
@Component
public class HomeServiceImpl implements HomeService{//인터페이스를 구현해서 만든 클래스
	
	
	//의존 객체 주입받기(DI). 의존 객체가 무조건 주입되는건 아니고 bean들끼리만 주입이된다.
	@Autowired Drill drill; //한줄로 써도 된다.
	
	
	//생성자
	public HomeServiceImpl() {
		System.out.println("HomeServiceImpl 객체가 생성됨");
	}
	
	@Override
	public void clean(String name) {
		System.out.println(name+"의 집을 청소해요!");
		
	}
	@Override
	public void wash(String name) {
		System.out.println(name+"의 빨래를 돌려요!");
		
	}
	@Override
	public void hole(String name) {
		System.out.println(name+"을/를 드릴로 뚫어요!");
		drill.hole();
		
	}
}

 

 

Drill.java(인터페이스)

package com.example.spring01.service;

public interface Drill {
	public void hole();
}

 

 

DrillImpl.java(클래스)

package com.example.spring01.service;

import org.springframework.stereotype.Component;

@Component // spring 이 component scan을 통해 해당 클래스로 객체를 생성해서 관리하도록 어노테이션을 붙임. 즉, 이 어노테이션을 붙임으로써 얘도 Spring Bean이 된다. 
public class DrillImpl implements Drill {
	@Override
	public void hole() {
		System.out.println("(드드드드듣ㄱ)");
	}
}

 

 

 

 

<14:30 5교시>

오전 진도 이어서.

Spring Bean Container 안의 애들은 서로 참조값을 넣어두고 사용할 수 있다.

 

 

 

새 프로젝트는 Spring Web을 만들어서

resources 하위 폴더의 application properties를 열고 server 포트와 컨텍스트 경로를 설정해둔다.

그리고 테스트용 html을 만든다.

 

 

프로젝트 우클릭을 눌러 서버를 실행시키고 나서 웹페이지에 localhost:9000/index.html이라고 입력하면 404가 뜨고

 

 localhost:9000/spring02 라고 하면 위에서 만든 인덱스 페이지가 나타난다.

 

 

Spring Web에서 작동시킨 서버는 웹 브라우저 창이 닫혀도 실행 중이다. 마찬가지로 정지 버튼이나 run as 재생 버튼으로 서버를 실행시키고 중지시킬 수 있다.

 

 

/hello라는 요청에 대해 "nice to meet you"라는 응답이 오도록 하는데 우리는그동안 서블릿을 썼는데, 여기서는 어떻게 하는지 보자.

 

 

오늘의 운세 출력해보래서 새로운 Controller 만들고 했는데 이렇게 해도 되지만 수업 시간에는 그냥 HelloController에 들어갔음. + 링크에 오타내놔서 자꾸 오류 났었음. 쌍따옴표 입력하면 자동으로 쌍따옴표 두개 생겨서 그 사이에 썼어야 하는데 쌍따옴표 남겨져 있어서 오타처럼 돼서 오류난거였음.

 

수업 시간에는 그냥 Hello 컨트롤러 안에 같이 진행함.

내가 했던대로 하고 따라하려니까 자꾸 에러나더라고. 아마도 Hello Controller에 있던거랑 FortuneController 안의 fortune()이 공유돼서 그랬나봄.

 

 

그래서 수업 시간에 한 거 그냥 백업

 

 

컨트롤러 메소드 안에서 HttpServletRequest, HttpServletResponse, HttpSession 등 객체가 필요하면 매개변수에 선언하면 된다.
선언만 하면 Spring 프레임워크가 알아서 해당 객체의 참조값을 매개변수에 전달해줌

 

 

SendController는 이런식으로 작동한다는 걸 보여주기 위해서 둘 다 msg를 사용했을 뿐, 실제 개발 상황에서는 이렇게 정하지 않는다고 함.

에러 화면

 

 

더보기

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/static/index.html</title>
</head>
<body>
	<div class="container">
		<h1>인덱스 페이지</h1>
		<ul>
			<li><a href="/spring02/hello">안녕 스프링 부트</a></li>
			<li><a href="/spring02/fortune">오늘의 운세</a></li>			
		</ul>
		
		<form action="/spring02/send" method="post">
			<input type="text" name="msg" placeholder="할말 입력" />
			<button type="submit">전송</button>
		</form>
		
		<form action="/spring02/send2" method="post">
			<input type="text" name="msg" placeholder="할말 입력" />
			<button type="submit">전송</button>
		</form>
	</div>
</body>
</html>

 

HelloController.java

package com.example.spring02.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/*
 * 클라이언트의 요청을 처리할 컨트롤러를 정의하고 bean으로 만들기
 */
@Controller
public class HelloController {
	
	@ResponseBody
	@GetMapping("/fortune")
	public String fortune() {
		return "열심히 하면 행운이 찾아올 것입니다";
	}
	
	
	@ResponseBody
	@GetMapping("/hello")// 클라이언트가 GET 방식"/hello" 경로로 요청하면 이 메소드가 실행됨
	public String hello() {
		
		//String type을 리턴하면서 메소드에 @ResponseBody 어노테이션을 붙여 놓으면 
		//여기서 리턴한 문자열이 클라이언트에게 그대로 출력됨
		return "만나서 반가워";
		//여기서 jsp 위치를 알려주면 jsp에 응답이 위임(forward)되어서 응답이 위임됨
		
	}
}

 

 

SendController.java

 

package com.example.spring02.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import jakarta.servlet.http.HttpServletRequest;

/*
 * 컨트롤러 메소드 안에서 HttpServletRequest, HttpServletResponse,
 * HttpSession 등 객체가 필요하면 매개변수에 선언하면 된다.
 * 선언만 하면 Spring 프레임워크가 알아서 해당 객체의 참조값을 매개변수에 전달해줌
 */
@Controller
public class SendController {
	

	@ResponseBody
	@PostMapping("/send")
	public String send(HttpServletRequest request) {
		// 요청 파라미터 추출
		String msg = request.getParameter("msg");
		// 콘솔창에 출력하기
		System.out.println(msg);
		return "/send okay!";
	}
	
	//전송되는 파라미터명과 동일하게 매개 변수를 선언하면 자동으로 추출되어서 매개 변수에 전달된다.
	//<input type="text" name="msg"/>
	@ResponseBody
	@PostMapping("/send2")
	public String send2(String msg) {
		System.out.println(msg);
		return "/send2 okay!";
	}
	
}

 

 

 

<15:30 6교시>

프로젝트 최종 검토하고 발표 준비하고, 4시 30분부터 발표 진행하고 발표 끝나면 진도 이어서 나간다고 함.

 

나는 일단 내 페이지에 만들고 싶은 기능 구상해봐야지

공방 사람들에게 제공할 수 있는 페이지여서 한번 만들면 여기저기 돈받고 팔 수 있을 듯.

 

0. 회원 가입/로그인 페이지

1. 내가 만들어서 팔려고 하는 상품들 리스트로 보여주는 페이지(약간의 포폴 기능)

    로그인 기능 : 상품 주문자를 위함(장바구니, 맞춤주문하기 페이지)

    내가 만든 상품의 사진 정면 측면 평면 사진하고 가능하면 gif 움짤사진

    내가 만든 상품의 분류(가방/지갑/액세서리 등)

    내가 만든 상품의 가격(가죽값+α)

    내가 만든 상품의 재고(재고 없는거는 제작하는 데 걸리는 시간)

    내가 만든 상품의 색상 옵션 구분

2. 사용자들이 주문하고 결제하는 페이지

   주문 내역, 주문 주소, 배송지, 결제 수단, 결제 가격, 배송비, 수리 관련 안내는 상자 포장, 각인 옵션

3. 맞춤 제작 주문 페이지

    색상, 상품 종류, 상품 수령 희망일(상품에 따라 제작 소요 기간이 달라질 수 있어 참고용), 각인 여부 등

4. 수선 주문 페이지

    방문 수선 : 공방 주소 입력(공방 운영 시간 안내) // 택배 수선 요청 폼(수선 요청 사항, 배달 받을 주소, 착불 택배, 수선비 안내)

 

 

 

<16:30 7교시>

프로젝트 발표 진행

 

 

<17:30 8교시> 

프로젝트 우클릭 > Run as > Spring Boot App으로 실행

 

 

서버 관련 설정은 key=value 형태로 작성함

Context-path=의 값이 없으면 context 경로가 없이 /가 경로가 됨

 

 

main>webapp 폴더가 없다.

Spring Boot는 jsp에 친화적이지 않다. 그래서 앞으로는 우리가 배웠던 jsp를 줄여나가는 무언가를 배우겠구나 싶다.

 

jsp 역할을 대신하고 심지어 가볍고 빠른 타임리프를 배울 것이다.

타임리프는 src/main/resources >template에 들어간다.

 

static 폴더에 들어가는거는 자바에서 해석하지 않고 그대로 웹브라우저로 출력해버릴 html, 이미지, css등을 넣는다.

 

 

 

수동으로 열어야 하는게 일단 단점인데, 자동으로 여는 코드도 넣어줄 수 있다고 함.

 

localhost:9000/spring02/

라고 입력하면 

resources/static/index.html을 읽어서 자동으로 응답하기로 한것

 

application properties 에서 컨텍스트 경로를 주석처리하면 위 주소에서는 에러가 발생하고

localhost:9000이라고 입력해야 인덱스 페이지가 나타남

 

 

컨트롤러는 어떤 요청이 왔을 때 어떻게 처리할 것인지에 대한 방법을 다룬다.

 

그림으로 그리면

@ResponseBody 어노테이션은 Controller가 바로 문자열 응답을 보내버림.

스프링은 스프링 디스패처 서블릿으로부터 시작한다.

스프링 디스패처 서블릿이 컨트롤러에 응답할 내용을 분기처리하고

컨트롤러가 응답한 내용을 jsp 같은 보이는 형태의 페이지로 응답해줌.

컨트롤러가 DB도 왔다갔다할 거고, 컨트롤러가 함수도 만들거고, 컨트롤러가 객체도 생성할 거다...

대략적인 그림이라고 함.

Dto, Dao 만드는것이 쉬워질 것이다.

 

 

챗 지피티한테 이 내용을 긁어서 틀린거 없나 물어봐야지.


네, 주어진 설명에서 몇 가지 부분이 조금 혼동될 수 있습니다. 아래에서 설명하겠습니다:

@ResponseBody 어노테이션의 역할:@ResponseBody는 컨트롤러 메서드가 반환하는 값을 HTTP 응답 본문에 직접 포함시키는 역할을 합니다. 이 말은 즉, @ResponseBody가 붙은 메서드는 뷰를 사용하지 않고, 데이터 (예: JSON, XML 등)를 클라이언트에 바로 보내는 것입니다. 그래서 JSP와 같은 페이지를 렌더링하지 않습니다.즉, 설명에서 "컨트롤러가 바로 문자열 응답을 보내버린다"는 말은 맞습니다. 이 경우에는 JSP 페이지가 아니라 데이터만 응답으로 전달됩니다.

스프링 디스패처 서블릿:설명에서는 스프링 디스패처 서블릿이 컨트롤러에 응답할 내용을 분기처리한다고 했습니다. 이 부분은 대체로 맞습니다. 스프링 디스패처 서블릿은 클라이언트의 요청을 받아서 적합한 컨트롤러로 전달하는 역할을 하고, 그 후 컨트롤러의 응답을 처리하여 결과를 반환합니다.

컨트롤러가 JSP를 사용하여 응답을 반환하는 부분:"컨트롤러가 응답한 내용을 jsp 같은 보이는 형태의 페이지로 응답해줌"이라는 설명은 일반적인 경우에 맞습니다. 기본적으로, 스프링에서는 뷰 리졸버(View Resolver)가 컨트롤러에서 반환한 모델 데이터를 JSP 등의 뷰 템플릿을 통해 클라이언트에게 HTML 페이지로 응답을 렌더링하는 방식입니다.컨트롤러의 기능:"컨트롤러가 DB도 왔다갔다할 거고, 컨트롤러가 함수도 만들고, 컨트롤러가 객체도 생성할 거다..." 이 부분은 맞는 설명입니다. 컨트롤러는 클라이언트의 요청을 처리하고, 필요한 로직을 수행하거나 데이터를 DB에서 조회하고, 응답을 생성하는 역할을 합니다.

결론적으로:
@ResponseBody 어노테이션이 붙은 메서드는 데이터만 응답하고, JSP 페이지는 반환하지 않습니다.스프링 디스패처 서블릿은 요청을 적절한 컨트롤러로 분기하며, 컨트롤러는 뷰를 사용할 때 JSP 페이지를 반환하거나, 데이터만 반환할 때는 @ResponseBody를 통해 데이터를 반환할 수 있습니다.

 

 

 

maven 관련 gitignore 파일 찾기

https://www.toptal.com/developers/gitignore/api/maven

 

gitignore.io 사이트

https://www.toptal.com/developers/gitignore/

 

gitignore.io

Create useful .gitignore files for your project

www.toptal.com