[Spring] 프로젝트 실전 ①

보람·2023년 5월 8일
0

Spring

목록 보기
18/18

1. 오류 확인하기 - Logger

  • Logger log = LoggerFactory.getLogger(getClass());을 불러오거나
  • lombok쓰고 있으면 @Slf4j로 대체
@Controller
@Slf4j
public class HomeController {

//	Logger log = LoggerFactory.getLogger(getClass());
	
	@RequestMapping("/")
	public String home() {
		log.info("home controller"); 
		return "home";	//home.html로 찾아간다.
	}
}
  • 콘솔창 출력

    쉽게 현재 위치 파악 가능

2. DTO 객체 사용

  • 엔티티로 사용할 DTO 따로 객체로 사용할 DTO 따로 사용

MemberForm.java

    @Getter @Setter
    public class MemberForm {

        private String name;
        private String city;
        private String street;
        private String zipcode;

    }

controller에 객체 그대로 넘길 수 있음

	@GetMapping("/members/new")
	public String createForm(Model model) {
		model.addAttribute("memberForm", new MemberForm());
		return "members/createMemberForm";
	}

타임리프에서 th:object, th:field 사용

		<form role="form" action="/members/new" th:object="${memberForm}" method="post">
			<div class="form-group">
				<label th:for="name">이름</label> 
				<input type="text" th:field="*{name}" class="form-control" placeholder="이름을 입력하세요" />

3. 프로젝트에서 JPA 사용

  • EntityManagerFactory 주입
    • @PersistenceUnit를 사용하면 되긴하나 굳이 사용 ❌
  • EntityManager 불러오기
    • @PersistenceContext도 굳이 사용 ❌
    • @Autowired가 대신 처리
      • 대신, private final EntityManager em;
      • final키워드 필요
    • final 키워드가 있는 생성자 : @RequiredArgsConstructor가 생성자 처리 가능

👍 결론

	@Repository
	@RequiredArgsConstructor
	public class MemberRepository {
		private final EntityManager em;
	}    

4. Service 클래스 - @transactional

(1) @transactional

  • DB와 관련된, 트랜잭션이 필요한 서비스 클래스 혹은 메서드@Transactional 추가
  • repository가 잘 안되면 service영역까지 rollback
  • 즉, 일련의 작업들을 묶어서 하나의 단위로 처리할 때

import 시 스프링에서 제공하는 것으로 사용

	org.springframework.transaction.annotation.Transactional

(2) @transactional 옵션

  • readOnly = true or false
    • 사용 하는 이유
      • 읽기전용일 때 사용
      • 비용을 아끼게 되므로 많이사용
  • class차원에 어노테이션 처리
    • @Transactional(readOnly=true)
    • 전체 메서드에 적용
  • class의 메서드 중 join메서드
    • insert이므로 읽기 전용이면 안됨
    • 그러면 따로 @Transactional을 써두면 됨

      클래스 레벨에서 transactional주는 것과 메서드에서 transaction 하는 것의 차이?

      • 그냥 select에 걸어주는 습관 같은 것, insert에만 transactioanl 따로 해주는 것이 관례

5. embedded 객체 타임리프로 받아오기

  • addresss 객체 통째로 members에 담겨있을 때
	<tr th:each="member : ${members}">
		<td th:text="${member.id}"></td>
		<td th:text="${member.name}"></td>
		<td th:text="${member.address?.city}"></td>
		<td th:text="${member.address?.street}"></td>
		<td th:text="${member.address?.zipcode}"></td>
	</tr>
profile
안녕하세요, 한보람입니다.

0개의 댓글