Paper.Yellow
복습 본문
개발 순서
1.화면설계서(UI)
- ui가 있어야 데이터베이스에 필요한 값을 정할 수 있다.
2.DB설계
3.기능 정의 -모든 기능 다 적기
4.화면과 기능 매칭
5.프로그램 만들기 -수정 보완
테이블 만들기
java에서 엔티티
ㄴ원칙은 setter를 따로 안 만듦.
Users
import java.sql.Timestamp;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class Users {
private Integer id;
private String username;
private String password;
private String email;
private Timestamp createdAt;
}
BoardsDao / UsersDao
import java.util.List;
public interface BoardsDao {
public void insert(Boards boards);
public List<Boards> findAll();
public Boards findById(Integer id);
public void update(Boards boards);
public void deleteById(Integer id);
}
import java.util.List;
public interface UsersDao {
public void insert(Users users);
public List<Users> findAll();
public Users findById(Integer id);
public void update(Users users);
public void deleteById(Integer id);
}
보통 insert가 아니라 save라고 많이 씀
Service
테이블마다 service를 만들진 않는다.
지금은 테이블마다 service를 만들어서 연습.
톰캣이 받는 리퀘스트, 리스폰스는 service에 안 받는다.
지금은 단순하게 DB에 연결되지 않으면 service에 넣지 않는고, controller에 둔다. 고 우선 외운다. 원래는 경우에 따라 다르다.
서비스는 기능을 수행만 하면 된다. 권한는 컨트롤러에서 받음.
통신 = 클라이언트 <> service <> DAO <> DB
DAO를 여러개 섞어 놓은게 service
UsersService
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import lombok.RequiredArgsConstructor;
import site.metacoding.red.domain.boards.BoardsDao;
import site.metacoding.red.domain.users.Users;
import site.metacoding.red.domain.users.UsersDao;
@RequiredArgsConstructor
@Service
public class UsersService {
private final UsersDao usersDao;
private final BoardsDao boardsDao;
public void 회원가입(디티오) { // username, password, email (id, createdAt)
// 1. 디티오를 엔티티로 변경하는 코드
// 2. 엔티티로 디비 수행
usersDao.insert(null);
}
public Users 로그인(디티오) { // username, password
Users usersPS = usersDao.findByUsername(디티오.getUsername());
// if로 usersPS의 password와 디티오 password 비교
}
public void 회원수정(Integer id, 디티오) { // id, 디티오(password, email)
// 1. 영속화
Users usersPS = usersDao.findById(id);
// 2. 영속화된 객체 변경
usersPS.update(디티오);
// 3. 디비 수행
usersDao.update(usersPS);
}
@Transactional(rollbackFor = RuntimeException.class)
public void 회원탈퇴(Integer id) {
usersDao.deleteById(id);
boardsDao.해당회원이적은글을 모두 찾아서 usersId를 null로 업데이트();
} // users - delete, boards - update
public boolean 아이디중복확인(String username) {
Users usersPS = usersDao.findByUsername(디티오.getUsername());
// 있으면 true, 없으면 false
}
public Users 회원정보보기(Integer id) {
Users usersPS = usersDao.findById(id);
return usersPS;
}
}
로그아웃을 할때 세션에서 처리한다. usersId는 세션값이기 때문에 클라이언트에게 받지 않음.
@Transactional(rollbackFor = RuntimeException.class) |
write를 수행하는 동시에 트랜잭션이 걸린다. delete가 끝날때까지 아무도 실행하지 못한다. 원래는 여기서 commit이 실행되고 밑에 코드가 실행된다. 밑에 코드를 실행. 내부적으로 트랜잭션을 두번 실행된다. 두개를 하나의 트랜잭션으로 묶는걸 위 코드로 한번에 할 수 있다. (두번째 코드가 실행 완료 될때까지 위 코드는 트랜잭션 실행되지 않는다.) 도중에 오류가 나면 다 rollback 됨. |
DROP TABLE boards;
create table boards(
id int primary KEY auto_increment,
title varchar(150),
content longtext,
usersId int,
createdAt TIMESTAMP
);
초기에 FOREIGN KEY가 있으면 번거롭기 때문에 우선 삭제한다.
개발 중에는 drop table이 편하다. (운영 중엔 절대 X)
좀 더 알아보기
애자일
'Spring Boote' 카테고리의 다른 글
자바스크립트 코드 리팩토링 (0) | 2022.09.16 |
---|---|
Ajax (0) | 2022.09.15 |
MairaDB 설치 및 초기설정 (0) | 2022.09.13 |
데이터 베이스 연결 (0) | 2022.09.01 |
데이터 받기 - Get / Post / Put / Delete (0) | 2022.08.29 |