-- 목차 --
1일 1로그 100일완성 IT 지식
12. 프로세서와 계산기의 다른 점
13. 모형 컴퓨터로 더하기 프로그램 만들기
12. 프로세서와 계산기의 다른 점
계산기 = 산술연산 + 메모리
프로세서 = 산술 연산 + 메모리 + 컴퓨터의 IO Device 제어 + 결정권이 있음*
계산이 시작된 후에는 운영자에 독립적
현재 처리 중인 데이터를 기반으로 다음에 무슨 일을 할지 결정할 수 있으므로 스스로 전체 시스템을 운영할 수 있다.
13. 모형 컴퓨터로 더하기 프로그램 만들기
컴퓨터 하드웨어 구성
프로세서
컴퓨터 하드웨어에 장착된 모든 장치의 동작을 제어하고 하드웨어에 명령을 실행한다.
정확히는 CPU내 데이터 연산과 관련이 있다.
- 컴퓨터 메모리의 한 위치에서 다른 위치로 데이터 이동
- 논리적 연산 또는 선택에 따라 새로운 명령어 세트로 점프
- ALU(산술 논리 장치)를 사용하여 수학 연산 수행
컴퓨터 메모리에 주소를 보내는데 사용하는 주소 버스
정보를 검색하거나 컴퓨터 메모리에 보내는데 사용되는 데이터 버스 사용
개인프로젝트
- JPA : Repository 와 SQL 사이에서 번역 해주는 역할
- Controller : 요청받은 URI 분기 및 응답을 되돌려주는 역할
- Service : 서비스 로직(트랜잭션) 실행
- Repository : DB와 직접 소통
- DTO : 클래스를 보호하고 계층간 소통을 위하여 사용
- Lombok : 필수로 사용하는 메서드나 생성자 등을 자동으로 생성해주어 코드를 절약할 수 있도록 도와주는 라이브러리
- Create - Post, Read - Get, Update - Put, Delete - Delete
Entity class 상속해보기
생성일과 수정일을 따로 timestamp라는 class로 빼서 상속해본다.
Timestamped.java
@MappedSuperclass // 상속했을 때, 컬럼으로 인식하게 합니다.
@EntityListeners(AuditingEntityListener.class) // 시간을 자동으로 반영하도록 설정
public class Timestamped {
@CreatedDate // 생성일
private LocalDateTime createAt;
@LastModifiedDate // 마지막 수정일
private LocalDateTime modifiedAt;
}
Board.java
@Data // getter, setter 생성
@NoArgsConstructor // 매개변수를 갖지 않는 constructor
@AllArgsConstructor // 모든 변수를 매개변수로 갖는 constructor
@Builder // builder 패턴 사용 가능
@Entity // JPA로 관리되는 객체라는 것을 의미. 자동으로 테이블 생성
public class Board extends Timestamped {
@Id // 기본키로 지정
@GeneratedValue(strategy = GenerationType.IDENTITY) // 내가 설정한 database의 전략을 따라가겠다.
private int id;
// 꼭 입력값이 필요함.
@Column(nullable = false)
private String title;
@Column(nullable = false)
private String author;
@Column(nullable = false)
private String password;
@Lob
private String content;
}
main함수가 있는 class에도 어노테이션 추가
Week01Application.java
@EnableJpaAuditing
@SpringBootApplication
public class Week01Application {
public static void main(String[] args) {
SpringApplication.run(Week01Application.class, args);
}
}
테이블이 잘 생성 되었다.
Hibernate:
create table board (
id integer not null auto_increment,
create_at datetime(6),
modified_at datetime(6),
author varchar(255) not null,
content longtext,
password varchar(255) not null,
title varchar(255) not null,
primary key (id)
) engine=InnoDB
Dto 만들기
Dto를 만들어야 하는 이유?
BoardDto.java
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class BoardDto {
private String title;
private String content;
private String author;
}
Dto로 write Service 만들기
BoardApiController.java
@PostMapping("/api/boards")
public ResponseDto<Board> write(@RequestBody Board board){
Board writeBoard = boardService.write(board);
return new ResponseDto<>(true, writeBoard);
}
BoardService.java
@Transactional
public Board write(Board board){
return boardRepository.save(board);
}
이후 데이터를 몇개 더 넣어준다.
게시글 전체 목록
BoardApiController.java
// 게시글 전체 목록
@GetMapping("/api/boards")
public ResponseDto<List<Board>> boardList(){
List<Board> list = boardService.allList();
return new ResponseDto<>(true, list);
}
BoardService.java
@Transactional(readOnly = true)
public List<Board> allList(){
return boardRepository.findAll();
}
특정 게시글 가져오기
BoardApiController.java
// 특정 게시글 가져오기
@GetMapping("/api/boards/{id}")
public ResponseDto<Board> getBoard(@PathVariable int id){
Board board = boardService.getBoard(id);
return new ResponseDto<>(true, board);
}
BoardService.java
@Transactional(readOnly = true)
public Board getBoard(int id){
Board board = boardRepository.findById(id).orElseThrow(()->
new IllegalArgumentException("해당 아이디가 존재하지 않습니다."));
return board;
}
Exception 발생시켜보기
Dto 로 update Service 만들기
BoardApiController.java
// 특정 게시글 수정하기
@PutMapping("/api/boards/{id}")
public ResponseDto<Integer> updateBoard(@PathVariable int id, @RequestBody BoardDto boardDto){
int boardId = boardService.updateBoard(id, boardDto);
return new ResponseDto<>(true, boardId);
}
BoardService.java
// public int update(int id, Board board){
// Dto 사용
@Transactional
public int update(int id, BoardDto boardDto){
// 영속화
Board updateBoard = boardRepository.findById(id).orElseThrow(
()-> new IllegalArgumentException("해당 게시글이 존재하지 않습니다.")
);
updateBoard.update(boardDto);
return updateBoard.getId();
}
Board.java
public void update(BoardDto boardDto){
this.title = boardDto.getTitle();
this.content = boardDto.getContent();
this.author = boardDto.getAuthor();
}
업데이트 시키기
업데이트 된거 확인하기
게시글 삭제하기
BoardApiController.java
// 특정 게시글 삭제하기
@DeleteMapping("/api/boards/{id}")
public ResponseDto<Integer> deleteBoard(@PathVariable int id){
int boardId = boardService.deleteBoard(id);
return new ResponseDto<>(true, boardId);
}
BoardService.java
public int deleteBoard(int id) {
try{
boardRepository.deleteById(id);
}catch (Exception e){
e.printStackTrace();
}
return id;
}
없는 게시글 삭제시
EmptyResultDataAccessException 발생
org.springframework.dao.EmptyResultDataAccessException: No class com.sparta.week01.model.Board entity with id 15 exists!
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.lambda$deleteById$0(SimpleJpaRepository.java:173)
at java.base/java.util.Optional.orElseThrow(Optional.java:403)
비밀번호 확인하기
BoardApiController.java
// 비밀번호 확인하기
@PostMapping("/api/boards/auth/{id}")
public ResponseDto<String> certifyPw(@PathVariable int id, @RequestParam String pw){
return boardService.certifyPw(id, pw);
}
BoardService.java
public ResponseDto<String> certifyPw(int id, String pw) {
Board board = boardRepository.findById(id).orElseThrow(
()-> new IllegalArgumentException("해당 게시글이 존재하지 않습니다.")
);
if(board != null)
if(board.getPassword().equals(pw))
return new ResponseDto<>(true, "비밀번호가 일치합니다.");
return new ResponseDto<>(false,"비밀번호가 일치하지 않습니다.");
}
비밀번호 맞을때
비밀번호가 틀릴때
Reference
댓글