본문 바로가기
카테고리 없음

[TIL] 항해 15일차

by yeaseul912 2022. 7. 26.
728x90
-- 목차 --
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);
}

postman
mysqlworkbench

이후 데이터를 몇개 더 넣어준다.

 

게시글 전체 목록

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

프로세서, 메모리, 캐시 개념 및 원리

[OS] 운영체제에서 Process란?

프로세서는 어떻게 작동합니까

반응형

댓글