728x90
h2 콘솔 접속방법
실행 후 jdbc url 나오면 입력하여 connect
어노테이션 설명 이미지
@AllArgsConstructor - 모든필드를 매개변수로 가지는 생성자
@NoArgsConstructor - 기본 생성자 생성
LoginController.java
package com.example.demo.controller;
import com.example.demo.model.entity.LoginEntity;
import com.example.demo.model.request.LoginDto;
import com.example.demo.service.LoginService;
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.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import java.util.ArrayList;
@Controller
public class LoginController {
@Autowired
private LoginService loginService;
//CREATE
@GetMapping("/login/insert")
public String insert(){
return "login/insert";
}
//CREATE
@PostMapping("/login/insert")
public String insert(LoginDto dto){
//crud사용방법 Repository에 save메소드에 저장하고싶은
//entity 인스턴스를 매개변수로 넘겨주면 처리결과를 entity형태로
//리턴해준다.
LoginEntity saved = loginService.save(dto.toEntity());
System.out.println(saved);
return "redirect:/login/selectOne/"+saved.getId();
}
//READ
@GetMapping("/login/selectOne/{id}")
public String selectOne(@PathVariable Integer id, Model model){
//findById 메소드는 id값으로 하나의 데이터를 얻어온다.
LoginEntity dto = loginService.findById(id); //찾았는데 없을수있음.
System.out.println(dto);
model.addAttribute("dto", dto);
return "login/selectOne";
}
//DELETE
@GetMapping("/login/delete/{id}")
public String delete(@PathVariable Integer id, RedirectAttributes rttr){
LoginEntity entity = loginService.findById(id);
if(entity != null){
loginService.delete(entity);
rttr.addFlashAttribute("msg", "delete success");
}
return "redirect:/login/selectAll";
}
//READ
@GetMapping("/login/selectAll")
public String selectAll(Model model){
ArrayList<LoginEntity> dtos = loginService.findAll();
model.addAttribute("dtos", dtos);
System.out.println(dtos);
return "login/selectAll";
}
//UPDATE
@GetMapping("/login/update/{id}")
public String update(@PathVariable Integer id, Model model){
LoginEntity dto = loginService.findById(id);
System.out.println(dto);
model.addAttribute("dto", dto);
return "login/update";
}
@PostMapping("/login/update")
public String update(LoginDto dto){
//id값이 있으면 update , null이면 isert
LoginEntity entity = dto.toEntity();
loginService.save(entity);
//return "redirect:/selectOne/"+entity.getId();
return "redirect:/login/selectAll";
}
}
LoginEntity.java
package com.example.demo.model.entity;
import lombok.*;
import javax.persistence.*;
import java.util.Date;
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
@SequenceGenerator(
name="LOGIN_ID_SEQ_GEN",//시퀀스 제너레이터 이름
sequenceName="LOGIN_ID_SEQ",//시퀀스 이름
initialValue=1,//시작값
allocationSize=1//메모리를 통해 할당할 범위 사이즈
)
public class LoginEntity {
@Id
@GeneratedValue(
strategy= GenerationType.SEQUENCE,//사용할 전략을 시퀀스로 선택
generator="LOGIN_ID_SEQ_GEN"//식별자 생성기를 설정해놓은 LOGIN_ID_SEQ_GEN으로 설정
)
private Integer id;
//int는 null을 허용할수없다. null일땐 0이 들어가서 헷갈릴수있으니 mapper클래스사용
//id 컬럼이 테이블을 식별하는 primary key 로 사용
@Column
private String name;
@Column
private String password;
}
LoginDto.java
package com.example.demo.model.request;
import com.example.demo.model.entity.LoginEntity;
import lombok.*;
import java.util.Date;
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
public class LoginDto {
private Integer id;
private String name;
private String password;
//Dto는 DB저장할때 위 데이터들을 가지고 Entity를 만들어야한다.
public LoginEntity toEntity(){
return new LoginEntity(id, name, password);
}
}
Entity란?
- DB 테이블에 존재하는 Column들을 필드로 가지는 객체이다.
- Entity는 DB의 테이블과 1대 1로 대응되며, 때문에 테이블이 가지지 않는 컬럼을 필드로 가져서는 안된다.
- 다른 클래스를 상속받거나 인터페이스의 구현체여서는 안된다.
DTO란?
- Data Transfer Object 의 약자
- 계층간 데이터 교환 역할
- Entity를 Controller 같은 클라이언트단과 직접 마주하는 계층에 직접 전달하는 대신 DTO를 사용해 데이터 교환한다.
- DTO는 그저 계층간 데이터 교환이 이루어 질 수 있도록 하는 객체로, 특별한 로직을 가지지 않는 순수한 데이터 객체여야 한다.
- DB에서 꺼낸 값을 DTO에서 임의로 조작할 필요가 없기 때문에 DTO에서는 Setter를 만들 필요가 없고 생성자에서 값을 할당한다.
Entity는 DB 테이블과 1대1로 대응 되는 객체이고
DTO는 계층간 교환을 위해 순수한 데이터 객체입니다.
설명 출처 : https://velog.io/@boo105/Entitiy-%EC%99%80-DTO-%EC%9D%98-%EB%B6%84%EB%A6%AC
LoginRepository.java
package com.example.demo.repository;
import com.example.demo.model.entity.LoginEntity;
import org.springframework.data.repository.CrudRepository;
import java.util.ArrayList;
public interface LoginRepository extends CrudRepository<LoginEntity, Integer> {
@Override
ArrayList<LoginEntity> findAll();
}
LoginService.java
package com.example.demo.service;
import com.example.demo.model.entity.LoginEntity;
import com.example.demo.repository.LoginRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
@Service
public class LoginService {
@Autowired
private LoginRepository loginRepository;
public LoginEntity save(LoginEntity dto){
LoginEntity save = loginRepository.save(dto);
return save;
}
public LoginEntity findById(Integer id){
return loginRepository.findById(id).orElse(null);
}
public ArrayList<LoginEntity> findAll(){
return loginRepository.findAll();
}
public void delete(LoginEntity dto) {
loginRepository.delete(dto);
}
}
{{>common/head}}
<div class="main">
<h2>TITLE Insert</h2>
<form action="/login/insert" method="post">
<table width="80%">
<tr>
<td>name:</td><td><input type="text" name="name"></td>
</tr>
<tr>
<td>password:</td><td><input type="text" name="password"></td>
</tr>
<tr>
<td colspan="2"><a href="/selectAll">listAll</a><input type="submit" value="submit"></td>
</tr>
</table>
</form>
</div>
{{>common/footer}}
<!--------------------------------insert.mustache----------------------------------------->
{{>common/head}}
<div class="main">
{{#msg}}
<h2>Message: {{msg}}</h2>
{{/msg}}
<h2>TITLE select ListAll</h2>
<table width="80%">
{{#dtos}}
<tr>
<td>id:</td><td>{{id}}</td>
</tr>
<tr>
<td>name:</td><td><a href="/login/selectOne/{{id}}">{{name}}</a></td>
</tr>
<tr>
<td>password:</td><td>{{password}}</td>
</tr>
{{/dtos}}
<tr>
<td colspan="2"><a href="/login/insert">new data</a></td>
</tr>
</table>
</div>
{{>common/footer}}
<!--------------------------------selectAll.mustache----------------------------------------->
{{>common/head}}
<div class="main">
<h2>TITLE selectOne</h2>
{{#dto}}
<table width="80%">
<tr>
<td>id:</td><td>{{id}}</td>
</tr>
<tr>
<td>name:</td><td>{{name}}</td>
</tr>
<tr>
<td>password:</td><td>{{password}}</td>
</tr>
<tr>
<td colspan="2"><a href="/login/selectAll">list all</a>
<a href="/login/delete/{{id}}">delete</a>
<a href="/login/update/{{id}}">update</a></td>
</tr>
</table>
{{/dto}}
</div>
{{>common/footer}}
<!--------------------------------selectOne.mustache----------------------------------------->
{{>common/head}}
<div class="main">
<h2>TITLE update</h2>
{{#dto}}
<form action="/login/update" method="post">
<table width="80%">
<input type="hidden" name="id" value="{{id}}">
<tr>
<td>id:</td><td>{{id}}</td>
</tr>
<tr>
<td>name:</td><td><input type="text" value="{{name}}" name="name"></td>
</tr>
<tr>
<td>password:</td><td><input type="text" value="{{password}}" name="password"></td>
</tr>
<tr>
<td colspan="2"><a href="/login/selectAll">list all</a>
<input type="submit" value="update"></td>
</tr>
</table>
</form>
{{/dto}}
</div>
{{>common/footer}}
<!--------------------------------update.mustache----------------------------------------->
728x90
'STUDY > SpringBoot' 카테고리의 다른 글
[Springboot] 22-09-28 페이징 기능 수업 -1 (0) | 2022.09.28 |
---|---|
[SpringBoot] 22-09-27 Thymeleaf 문법 총 정리 (0) | 2022.09.27 |
[SpringBoot] 22-09-23 템플릿엔진 Mustache (1) | 2022.09.23 |
[SpringBoot] 스프링부트 설치와 시작 전체 설명 ppt (0) | 2022.09.23 |
[SpringBoot] 데이터 생성 with JPA (엔티티,레파지토리) 정리✔ [4] (0) | 2022.08.25 |