상세 컨텐츠

본문 제목

프로그래머 도전기 104일차

프로그래머가 될거야!

by Choyee 2024. 1. 18. 21:26

본문

오늘은

 

각종 채용 사이트를 돌아보며 공고를 보고 지원 자격과

경쟁률 등을 살펴보았는데...

굉장히 심리적으로 불안해지고 힘들어지는 것 같습니다

과연 저 사이에서 내가 취직을 할 수 있을까 두려워지는군요...

일단 자신감을 갖고 지원을 해보았습니다

연락이 와서 면접을 하게 된다면 최선을 다해 준비를 해야겠습니다

 

 

Spring_Boot 공부

 

<멤버 part>

* 멤버 상세 조회
Spring = http://localhost:8080/member?id=3 => 쿼리 방식에서
SpringBoot = http://localhost:8080/member/3 => 주소 방식으로 바뀜
               => @GetMapping("member/{id}")


* builder방식으로 내보내기

@NoArgsConstructor
@AllArgsConstructor
@Builder   // 생성자 어노테이션 필요
@Data
@Table(name = "tbl_member")
@Entity
public class Member {
@Id  // PK(기본키)
@GeneratedValue(strategy = GenerationType.IDENTITY)

@Column
private Long id;
@Column(unique = true)   // 유일성 가짐, 중복검사
private String memberEmail;
@Column(nullable = false)   // 필수 입력 = not null
private String memberPassword;
@Column(length = 30, nullable = false)
private String memberName;
@Column
private int memberAge;

// dto -> entity 변환 메서드 
// dto를 매개로 받아서 entity에 저장
public static Member toSaveEntity(MemberDTO memberDTO) {
    // Member member = new Member();
    // member.setMemberEmail(memberDTO.getMemberEmail());
    // member.setMemberPassword(memberDTO.getMemberPassword());
    // member.setMemberName(memberDTO.getMemberName());
    // member.setMemberAge(memberDTO.getMemberAge());

    // builder 방식으로 member 내보내기
    Member member = Member.builder().memberEmail(memberDTO.getMemberEmail())
                            .memberPassword(memberDTO.getMemberPassword())
                            .memberName(memberDTO.getMemberName())
                            .memberAge(memberDTO.getMemberAge())
                            .build();

    return member;
}




* 오류 페이지 처리

* MemberService

public class MemberService {

private final MemberRepository memberRepository;

public MemberDTO findById(Long id) {
    // db에서 member 1개 꺼내오기
    // Member member = memberRepository.findById(id).get();
    // id가 없을 때 오류 처리 - "url을 찾을 수 없습니다"
    Optional<Member> member = memberRepository.findById(id);
    
    if(member.isPresent()) {
        // entity -> dto 변환
        // MemberDTO memberDTO = MemberDTO.toSaveDTO(member);
        MemberDTO memberDTO = MemberDTO.toSaveDTO(member.get());
    	return memberDTO;
    }else {
    	throw new BootBoardException("찾는 데이터가 없습니다");
    }
}




* BootBoardException

package cohttp://m.khit.board.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

// 사용자 Exception은 RuntimeException을 상속받아야 함
// @ResponseStatus - 404 오류 표시하는 클래스
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class BootBoardException extends RuntimeException{
    private static final long serialVersionUID = 1L;

	// 생성자
    public BootBoardException(String message) {
    	super(message);
    }
}


}



* BootBoardExceptionHandler

package cohttp://m.khit.board.exception;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;

@ControllerAdvice   // 예외처리 역할을 하는 클래스(controller 보조 역할)
@RestController   // 문자를 반환하는 클래스
public class BootBoardExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    public String globalExceptionHandler(Exception e) {
        return "<h2>" + e.getMessage() + "</h2>";
    }
}






* Ajax활용 유효성 검사
- jQuery 포함

<script src="https://code.jquery.com/jquery-3.7.1.js" 
    integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4=" 
    crossorigin="anonymous"></script>
$.ajax({})





<게시판 part>

게시판 - Board, BoardDTO
글쓰기
글목록
글 상세보기
글 수정, 삭제
페이지 처리 및 검색
댓글


* 날짜 관리
회원, 게시판, 댓글, 상품등록 - 등록일, 수정일
시간을 관리하는 클래스(부모) - BaseEntity(보통 이런 클래스명으로 쓴다)
@MappedSuperClass, @EntityListeners()
=> 시간 상속 -> 각 class에 extends로 상속해서 쓴다

* BoardEntity

package cohttp://m.khit.board.entity;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Data;

@Data
@Table(name="tbl_board")
@Entity   // 테이블이 생성되는 class
public class Board extends BaseEntity{
    // 필드
    @Id  // = PK
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable=false)
    private String boardTitle;
    @Column(length=30, nullable=false)
    private String boardWriter;
    @Column(nullable=false)
    private String boardContent;
    @Column
    private Integer boardHits;
}





* BaseEntity

package cohttp://m.khit.board.entity;

import java.time.LocalDateTime;

import org.hibernate.annotations.CreationTimestamp;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import lombok.Getter;

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {

    @CreationTimestamp
    @Column(updatable = false)
    private LocalDateTime createdDate;

    @CreationTimestamp
    @Column(insertable = false)
    private LocalDateTime updatedDate;
}




* BoardDTO

package cohttp://m.khit.board.dto;

import java.time.LocalDateTime;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class BoardDTO {
    private Long id;
    private String boardTitle;
    private String boardWriter;
    private String boardContent;
    private Integer boardHits;

    private LocalDateTime createdDate;
    private LocalDateTime updatedDate;
}






* Java
BoardController(Bean등록 @Controller)
BoardService(@Service)
BoardRepository(interface) => JPARepository 상속 받음



* 날짜표기 함수

${#temporals.format(board.createdDate, 'yyyy-MM-dd HH:mm:ss')}



* 조회수
1. repository - @Query(value="update Board b set b.boardHits=b.boardHits+1 where b.id=:id")
                    - @Modifying
                    - 쿼리 메소드 = findByBoardEmail()
2. Service - @Tranctional - 단위 작업의 완료

예) 트랜잭션
(송금 -> 입금) = 한개의 트랜잭션이다
commit
rollback


* th if문

<th:if="조건내용" th:text="실행값1">
<th:unless="조건내용" th:text="실행값2">


=> 조건 내용을 똑같이 써준다




* @Valid활용 유효성 검사
- 공백문자 처리
- 문자의 길이
1. pom.xml -> validation 의존성 주입 (= 라이브러리 사용)
2. BoardDTO에 유효성 처리
   @NotEmpty, @Size 등 활용
3. @Valid BoardDTO boardDTO
   BindResult 클래스 사용
4. thymeleaf :
   th:field = *{boardTitle}
   => name, id, value 모든 속성을 포함


* 비밀번호 암호화 - 시큐리티(로그인)


* JPA 페이지 처리 클래스
Pageable - 페이지당 글개수, 페이지 나눔  -> number, size
Page - 페이지 번호, 다음, 이전, 총개수, 총페이지수

* view - thymeleaf
페이지 번호 - 순번

<span th:each="page: ${#numbers.sequence(1,5)}">  #객체.함수()
  <span th:text="${page}"></span>
</span>

 

 

 

 

 

 

 

 

 

 

2023. 01. 18 (목)

관련글 더보기