오늘은
각종 채용 사이트를 돌아보며 공고를 보고 지원 자격과
경쟁률 등을 살펴보았는데...
굉장히 심리적으로 불안해지고 힘들어지는 것 같습니다
과연 저 사이에서 내가 취직을 할 수 있을까 두려워지는군요...
일단 자신감을 갖고 지원을 해보았습니다
연락이 와서 면접을 하게 된다면 최선을 다해 준비를 해야겠습니다
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 (목)
프로그래머 도전기 106일차 (2) | 2024.01.23 |
---|---|
프로그래머 도전기 105일차 (2) | 2024.01.22 |
프로그래머 도전기 103일차 (0) | 2024.01.15 |
프로그래머 도전기 102일차 (2) | 2024.01.14 |
프로그래머 도전기 101일차 (0) | 2024.01.13 |