테이블 간의 관계 추가

Car테이블과 일대다 관계에 있는 Owner라는 새 테이블을 추가해보자. 여기서 일대다 관계라는 것은 소유자 한명이 자동차 여러대를 가질 수 있지만 한 자동차의 소유자는 한명이라는 뜻이다. 

먼저Owner엔티티와 리포지터리를 만듦. 

 

일대다 관계를 추가하려면 @ManyToOne 및 @OneToMany 어노테이션을 이용한다. Car 엔티티 클래스에서는 @ManyToOne 어노테이션으로 관계를 정의.

 

RESTful 웹 서비스 만들기

스프링 부트에서 모든 HTTP 요청은 컨트롤러 클래스로 처리. RESTful 웹 서비스를 만들려면 먼저 컨트롤 클래스를 만들어야 한다. 

 

스프링 데이터 REST(Spring Data REST)는 스프링 데이터 프로젝트의 일부 이며 스프링으로 쉽고 빠르게 RESTful 웹 서비스를 구현할 수 있게 해준다. 스프링 데이터 REST를 이용하려면 다음 의존성 추가.

<!--rest 의존성-->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-rest</artifactId>

</dependency>

 

application.properties 파일에서 서비스의 엔드포인트(API가 서버셍서 리소스에 접근할 수 있도록 가능하게 하는 URL)를 정의할 수 있다.

#스프링 데이터 RESTful setting

spring.data.rest.basePath=/api

'spring, springboot' 카테고리의 다른 글

게시판이 여러 이미지를 가지고 있을 때,JPA  (0) 2023.09.13
BoardDao와 BoardService 인터페이스의 차이  (0) 2023.09.06
springBoot file  (0) 2023.09.05
스프링 부트 api  (0) 2023.09.04
Model  (0) 2023.08.24

이미지는 게시판에서만 쓸때 이미지 service를 따로 만들 필요 없이 imageVO와 ImageDao, Image.xml만 만듦.

게시판은 이미지를 가지고 있다.

public class multipleBoardVO extends CommonVO{

 

private List<ImageVO> images;

 

https://start.spring.io/

로 외부에서 프로젝트를 만들 수 있다.

 

@EnableAutoconfiguration: 스프링 부트 자동 구성을 활성화. 

@ComponectScan: 스프링 부트 컴포넌트 검색으로 애플리케이션의 모든 컴포넌트를 찾음.

@Configuration: 빈 정의의 원본으로 쓸 수 있는 클래스를 정의.

 

 

ORM, JPA,하이버네이트

ORM: 데이터를 객체지향 패러다임으로 조작하고 데이터를 검색하는 기술.

데이터 베이스 구조보다는 객체지향 개념에 기반을 두고 있어 개발 속도를 높이고 소스코드의 양이 줄어든다.

ORM을 사요하면 데이터베이스로부터 거의 독립적인 코드 작성이 가능하며 사용하는 DBMS에 따라 조금씩 달라지는 SQL문에 관해 개발자가 걱정할 필요가 없다.

 

 

JPA: 자바 개발자를 위한 객체-관계형 매핑을 제공. JPA엔티티는 데이터베이스 테이블 구조를 나타내는 자바 클래스. 엔티티 클래스의 필드는 데이터 베이스 테이블의 열을 나타낸다.

 

하이버네이트: 가장인기 있는 JPA구현체이고 스프링부트에서 기본 구현체로 활용된다. 

 

엔티티 클래스 만들기

엔티티 클래스: JPA의 @Entity 어노테이션을 사용하는 자바클래스. 엔티티 클래스는 표준 자바 빈의 명명 규칙을 따르며 적절한 getter와 setter를 가진다. 클래스 필드의 가시성은 private로 설정된다.

JPA: 애플리케이션이 초기화 될 때 클래스 이름으로 데이터베이스 테이블을 만든다. 데이터베이스 테이블에 다른 이름을 지정하려면 엔티티 클래스에서 @Table어노테이션을 이용하면 된다. (클래스 이름이 테이블명이 된다.)

 

메서드가 한 항목만 반환할 때는 T 대신 Optional<T>를 반환. 

Optional: 값을 포함하거나 포함하지 않은 단일 값 컨테이너. 값이 있으면 isPresent()메서드가 true를 반환하고 없으면 false를 반환.값이 있으면 get()메서드로 값을 구할 수 있다.

 

스프링 데이터 리포지터리에 쿼리를 정의할 수 있다. 쿼리는 접두사(findBy)로 시작해야하고 그 다음에 쿼리에 이용할 엔티티 클래스 필드가 나와야한다. like가 아니라 일치하는 값.

findByBrand, findByColor, findByYear

 

'spring, springboot' 카테고리의 다른 글

jpa  (0) 2023.09.14
BoardDao와 BoardService 인터페이스의 차이  (0) 2023.09.06
springBoot file  (0) 2023.09.05
스프링 부트 api  (0) 2023.09.04
Model  (0) 2023.08.24

 

  1. BoardDao 인터페이스:
    • DAO는 "Data Access Object"의 약자로, 데이터베이스와 직접 상호작용하는 역할
    • 주로 데이터베이스에서 데이터를 조회, 삽입, 업데이트, 삭제하는 메서드를 선언
    • 데이터베이스 연결 및 SQL 쿼리 실행과 관련된 로직을 포함
    • 데이터베이스 테이블과의 직접적인 상호작용을 담당하므로, 데이터 액세스 레이어의 역할을 수행
  2. BoardService 인터페이스:
    • Service는 비즈니스 로직을 정의하고 이를 실행하는 역할
    • 비즈니스 로직은 데이터베이스 조작 이외의 업무 로직, 예를 들어 데이터의 가공, 검증, 트랜잭션 관리 등을 포함
    • 주로 컨트롤러(Controller)와 DAO 사이에서 중간 역할을 하며, 비즈니스 로직을 담당하는 레이어
    • 비즈니스 로직을 처리하고 결과를 컨트롤러에 반환

요약하면, BoardDao는 데이터베이스와 직접적으로 상호작용하며 데이터 액세스 레이어를 나타내고, BoardService는 비즈니스 로직을 처리하고 이를 컨트롤러에 제공하는 서비스 레이어. 이를 통해 코드의 모듈화와 유지보수성을 향상시킬 수 있으며, 역할과 책임을 분리하여 프로젝트를 더 잘 구성할 수 있습니다.

'spring, springboot' 카테고리의 다른 글

jpa  (0) 2023.09.14
게시판이 여러 이미지를 가지고 있을 때,JPA  (0) 2023.09.13
springBoot file  (0) 2023.09.05
스프링 부트 api  (0) 2023.09.04
Model  (0) 2023.08.24

썸네일은 파일 크기를 줄여서 사용, 그에 따른 컬럼 필요.

spring.servlet.multipart.location=C:\\uploadStorage\\ 

경로 설정을 위해 \\ 사용

package com.spring;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**리소스 등록 및 핸들러를 관리하는 객체인 ResoruceHandlerRegistry를 통해
 * 리소스의 위치와 리소스와 매칭될 url을 설정한다.*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
	/*웹에서 요청할 패턴*/
	private String connectPath = "/uploadStorage/**";
	/**경로 설정시
	 * -경로의 마지막은 반드시 "/" 또는 "\"로 끝나야 한다.
	 * -로컬 디스크 경로일 경우 file:///접두어를 명시해 두어야 한다.
	 * */
	private String resourcePath = "file:///C:\\uploadStorge\\";
	

	/**addResourcehandler: 리소스와 연결될 URL path를 지정.
	 * addResourceLocations: 실제 리소스가 존재하는 외부 경로를 지정.*/	
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler(connectPath)
				.addResourceLocations(resourcePath);
	}

}

 

'spring, springboot' 카테고리의 다른 글

게시판이 여러 이미지를 가지고 있을 때,JPA  (0) 2023.09.13
BoardDao와 BoardService 인터페이스의 차이  (0) 2023.09.06
스프링 부트 api  (0) 2023.09.04
Model  (0) 2023.08.24
springBoot project 새로만들기  (0) 2023.08.22

프로젝트 구조

com.spring.openapi.data.controller

 DataController

com.spring.openapi.data.service

 DataService

 DataServiceImpl

WEB-INF/views/data 폴더 생성

 

반환값은 data 응답할 문서파일은 xml


 https://apis.data.go.kr/6300000/openapi2022/tourspot/gettourspot?serviceKey=서비스키&pageNo=1&numOfRows=10

name=값&name=값

공백을 값으로 인식하기 때문에 절대로 공백없이

[]괄호가 열리면 0번째.

items:[

{"tourspotNm",

"tourspotZip",...

}

]

items의 0번째가 data값.

확장프로그램으로 데이터 페이지를 보기 편하게 할 수 있다.

 

'spring, springboot' 카테고리의 다른 글

BoardDao와 BoardService 인터페이스의 차이  (0) 2023.09.06
springBoot file  (0) 2023.09.05
Model  (0) 2023.08.24
springBoot project 새로만들기  (0) 2023.08.22
springBoot  (0) 2023.08.21

스프링 부트(Spring Boot)는 자바 기반의 웹 애플리케이션을 개발하기 위한 프레임워크로서, 스프링(Spring) 프레임워크를 기반으로 하며 개발자들이 더 간편하게 웹 애플리케이션을 구축하고 실행할 수 있도록 도와줍니다. 스프링 부트는 웹 애플리케이션의 여러 측면을 다루는 다양한 기능과 클래스를 제공하는데, 그 중에서도 Model 클래스는 웹 애플리케이션의 뷰(View)와 컨트롤러(Controller) 사이에서 데이터를 전달하는 역할을 합니다.

Model은 스프링의 MVC 아키텍처(Model-View-Controller)에서 사용되는 개념 중 하나로, 다음과 같은 역할을 수행합니다:

  1. 데이터 전달: Model은 컨트롤러(Controller)에서 처리한 데이터를 뷰(View)로 전달하는 데 사용됩니다. 이는 클라이언트에게 보여질 데이터나 웹 페이지의 내용 등을 포함합니다.
  2. 데이터 저장: Model은 뷰에서 전달된 데이터를 임시로 저장하는 역할을 수행합니다. 이렇게 저장된 데이터는 뷰에서 필요한 경우에 사용될 수 있습니다.
  3. 뷰에 데이터 제공: 뷰는 Model에서 제공한 데이터를 사용하여 웹 페이지를 동적으로 구성하고, 사용자에게 적절한 정보를 보여줍니다.

스프링 부트에서 Model 객체는 주로 컨트롤러 메서드의 매개변수로 선언되며, 메서드 내에서 데이터를 담고 뷰로 전달하는 역할을 수행합니다. 일반적으로 Model은 키-값 쌍으로 데이터를 저장하며, 이 데이터는 뷰에서 해당 키를 사용하여 접근할 수 있습니다.

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MyController {
    @GetMapping("/hello")
    public String hello(Model model) {
        String message = "Hello, Spring Boot!";
        model.addAttribute("greeting", message); // 데이터를 Model에 추가
        
        return "helloPage"; // 뷰의 이름을 반환
    }
}
src/
└── main/
    ├── java/
    │   └── com/
    │       └── example/
    │           ├── MyApplication.java
    │           ├── MyController.java
    ├── resources/
    │   └── application.properties
    └── webapp/
        └── WEB-INF/
            └── views/
                └── helloPage.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>Hello Page</title>
</head>
<body>
    <h1>${greeting}</h1>
</body>
</html>
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MyController {
    @GetMapping("/hello")
    public String hello(Model model) {
        String message = "Hello, Spring Boot!";
        model.addAttribute("greeting", message);
        
        return "helloPage";
    }
}

application.properties

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

 

SpringBoot 작성 순서.

  1. VO (Value Object) 작성:
    • 데이터를 저장하고 전달하기 위한 객체를 정의하는 클래스를 작성합니다.
    • 필요한 데이터 필드와 getter/setter 메서드를 포함하여 작성합니다.
    • 주로 데이터베이스의 테이블과 매핑될 수 있습니다.
  2. DAO (Data Access Object) 작성:
    • 데이터베이스와의 상호 작용을 처리하는 클래스를 작성합니다.
    • 데이터베이스에 데이터를 조회, 삽입, 갱신, 삭제하는 메서드를 작성합니다.
    • 주로 JPA, MyBatis 등의 ORM(Object-Relational Mapping) 기술을 사용하여 구현합니다.
  3. Service 클래스 작성:
    • 비즈니스 로직을 수행하는 서비스 클래스를 작성합니다.
    • DAO를 이용하여 데이터베이스와의 상호 작용을 호출하고, 비즈니스 로직을 구현합니다.
    • 트랜잭션 처리, 데이터 가공, 복잡한 비즈니스 규칙 등을 처리합니다.
  4. 컨트롤러(Controller) 클래스 작성:
    • 사용자의 요청을 처리하는 컨트롤러 클래스를 작성합니다.
    • @Controller 어노테이션을 추가하여 컨트롤러임을 명시합니다.
    • 각 요청에 대한 처리 메서드를 작성하고, Service 레이어를 호출하여 비즈니스 로직을 수행합니다.
    • 필요한 경우에는 모델(Model)을 생성하고 뷰 이름을 반환합니다.
  5. 뷰(View) 템플릿 작성:
    • 사용자에게 보여질 웹 페이지의 모습을 정의하는 뷰 템플릿을 작성합니다.
    • Thymeleaf, JSP, Freemarker 등을 사용하여 뷰 템플릿을 구현합니다.
  6. 스프링 설정 및 라우팅:
    • application.properties나 application.yml 파일을 통해 애플리케이션 설정을 구성합니다.
    • 컨트롤러의 요청 매핑과 뷰 리졸버 설정을 등록합니다.
  7. 실행 및 테스트:
    • 애플리케이션을 실행하여 웹 서버를 시작합니다.
    • 웹 브라우저나 API 클라이언트를 통해 컨트롤러가 응답하는지 테스트합니다.
     

 

pom.xml에 라이브러리 설정 필요한 것만 세팅이 안되어 있으면 오류.

web, test, db, jsp...

시험볼 때 tiles setting 가져오면 안됨. devProject: pom.xml, 내용은 spring쪽

가장기본적인것, control 단과 뷰단을 만들고 매핑해서 보이면 service, dao로 다음으로 xml 

control단, 뷰(.jsp)로 갈수 있는 메서드 하나(매핑)만 만들고 뷰단이 보이는지

패키지 잘못쓰면 삭제 후 다시 만들기

패키지 하위에 만들기

5번하기 전에 Mybatis 설정파일만 이름을 다줘서 세팅

config는 mybatis 설정파일

그다음 properties 수정

 

 

 

'spring, springboot' 카테고리의 다른 글

springBoot file  (0) 2023.09.05
스프링 부트 api  (0) 2023.09.04
springBoot project 새로만들기  (0) 2023.08.22
springBoot  (0) 2023.08.21
Array, ArrayList,sampleDTOList  (0) 2023.08.18

https://congsong.tistory.com/15

 

스프링 부트(Spring Boot) - 게시판 CRUD 처리하기 [Thymeleaf, MariaDB, IntelliJ, Gradle, MyBatis]

본 게시판 프로젝트는 단계별(step by step)로 진행되니, 이전 단계를 진행하시는 것을 권장드립니다. 본 포스팅은 DBeaver를 기준으로 작성된 글이며, 만약 MariaDB가 설치되어 있지 않으시다면, 선행

congsong.tistory.com

 

프로젝트 생성 후 아래의 내용 순으로 진행하시면 됩니다. 참고해 주세요.
1. 프로젝트 생성 2. pom.xml 설정 3. application.properties 환경설정 파일인 properties 파일 인코딩 변경(UTF-8) 4. 패키지 생성 및 폴더 생성 및 환경 설정에 필요한 파일 생성 5.  application.properties 수정 6. 클래스 및 인터페이스 생성.

'spring, springboot' 카테고리의 다른 글

스프링 부트 api  (0) 2023.09.04
Model  (0) 2023.08.24
springBoot  (0) 2023.08.21
Array, ArrayList,sampleDTOList  (0) 2023.08.18
springBoot  (0) 2023.08.17

src/main/java

com.boot.example.dao

 SubjectDAO =>인터페이스 생성

src/test/java

com.boot.example.dao

 SubjectTests => 단위테스트를 위한 클래스 생성

com.boot.example.service

 SubjectService =>인터페이스 생성(다형성 - 결합도가 낮은 프로그램)

 SubjectServiceImpl => 구현 클래스 생성

com.boot.example.controller

 SubjectController => controller 클래스 생성

 공통 매핑: /subject/로 명시

 

학과 리스트 매핑: /subject/subjectList

뷰단: /WEB-INF/views/subject/subjectList.jsp

학과 입력 매핑: /subject/subjectInsert

 

application.properties에 위치 설정

# 뷰리졸버 설정

spring.mvc.view.prefix=/WEB-INF/views/

spring.mvc.view.suffix=.jsp

return 앞에 prefix, 뒤에 suffix

 

src/main/java: 로직을 실행시키기 위한 폴더.

src/test/java: 단위테스트를 위한 폴더로 로직이 나오지 않음.

 

1.controller

인스턴스가 제일 먼저 만들어져야함.

어노테이션을 통해 @Controller (인스턴스 생성)

 

1-1.서비스를 구현해서 구현클래스를 통해 인스턴스 생성

@Service

1-2.

controller에 subject매핑

@RequestMapping("/subject/*")

@Slf4j:controller에 원래 안씀, 연습하기 위해 사용

1-3.매핑 /subjectList

서비스가 subjectList 호출

데이터가 아니라 뷰

package com.boot.example.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import com.boot.example.domain.SubjectVO;
import com.boot.example.service.SubjectService;

import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

@Controller
@RequestMapping("/subject/*")
@Slf4j
public class SubjectController {
	
	@Setter(onMethod_=@Autowired)
	private SubjectService subjectService;
	
	@GetMapping("/subjectList")
	public String subjectList(Model model) {
		log.info("subjectList 메서드 호출");
		
		List<SubjectVO> subjectList = subjectService.subjectList();
		model.addAttribute("subjectList", subjectList);	//속성 추가
		
		return "subject/subjectList";
	}

}

 

2.service는 DAO가 필요

serviceImpl에서 만든 subjectList를 controller에서 받음.

package com.boot.example.service;
import java.util.List;

import com.boot.example.domain.SubjectVO;
public interface SubjectService {
	public List<SubjectVO> subjectList();

}
package com.boot.example.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.boot.example.dao.SubjectDAO;
import com.boot.example.domain.SubjectVO;

import lombok.Setter;

@Service
public class SubjectServiceImpl implements SubjectService{

	//service 는 DAO없이는 안되고
	//control단은 service 없이는 안됨.
	@Setter(onMethod_=@Autowired)
	private SubjectDAO subjectDAO;
	
	@Override
	public List<SubjectVO> subjectList() {
		List<SubjectVO> list = null;
		list = subjectDAO.subjectList();
		return list;
	}

}

인터페이스를 구현해서 사용하면되니 개발자가 구현 클래스만 수정하면 됨.

결합도가 낮으면 수정하기 쉬워야함.

 

단위테스트를 하는게 훨씬 속도가 빠르다.

입력, 수정, 삭제는 사용 후 다시 불러와야하므로 redirect 사용

:/

'spring, springboot' 카테고리의 다른 글

Model  (0) 2023.08.24
springBoot project 새로만들기  (0) 2023.08.22
Array, ArrayList,sampleDTOList  (0) 2023.08.18
springBoot  (0) 2023.08.17
spring(의존성 주입(DI))  (0) 2023.08.16

+ Recent posts