Paper.Yellow

복습 본문

Spring Boote

복습

Paper.Y 2022. 9. 13. 10:41

개발 순서 

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;
}

improt 주의

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