240228 TIL

2024. 2. 28. 15:45스파르타_부트캠프/TIL

Git 특강

branch란?

수정은 하고 싶은데 원래 파일은 그대로 놔두고 싶을 때 어떻게 해야할 것인지

브랜치는 코드 파일의 일종의 복사본

 

생성

git branch <브랜치 이름>

git branch login

 

조회

git branch

-> 현재 branch로 확인

 

이동 명령어

git switch <브랜치 이름>

git checkout <브랜치 이름>

 

생성 및 이동

git switch -c <브랜치 이름>

git checkout -b <브랜치 이름>

 

브랜치 합치는 순서

1. login branch에서 작업 후 commit 한다.

2. main branch로 switch한다.

3. branch merge login을 한다.

 

Pull Request

git merge를 쓸 일이 많이 없다. 터미널에서 말고 "github에서 합친다."

일반적으로 github에서 pull request를 통해 merge하는데 코드 리뷰를 하기 위해서 그렇다.

 

용어 정의

"합치고 싶습니다!" 라고 github 측에 request하는 것. 

 

Pull Request를 작성순서

1. 기능 브랜치 생성 및 이동

2. 기능 개발 및 코드 저장

3. 코드 업로드 및 Pull Request 생성

4. github merge

5. git switch main

6. git pull origin main

 

협업 실전 가이드

Main 브랜치 === 배포용

Main 브랜치는 사용자들에게 다 공개되는 브랜치이다.

일반적으로 Main 브랜치를 개발용으로 

Main 브랜치 작업 시 문제점 및 해결사항

문제점1

main 하나로 개발하면

- 완벽하게 기능 개발해야 merge 가능

- 회원가입, 로그인, 로그아웃이 다 완료되어야 합치면 버그 찾는데 오래걸림

 

해결 방안

다음과 같이 dev 브랜치를 두어 각 feature 브랜치가 완료되면 dev 브랜치에 merge한다.

개발이 전부 완료되면 dev->main으로 merge한다. 

=================================

main브랜치 <= dev브랜치 <= feature 브랜치

<배포용>           <테스트용>      <기능 개발용>

=================================

feature->develop : O

feature-> main merge : X

develop -> main merge : O

 

문제점 2

main에서 개발 시 충돌이 발생할 수 있다.

 

해결 방안

다음과 같이 dev->feature로 pull하고 테스트를 진행하고 "로컬"에서 충돌을 해결하고 테스트한다.

이 후 테스트가 완료되면 push, pull request를 진행한다.

 

실전 가이드

팀장

초기 세팅

1. 폴더 생성

2. 초기 코드 작성

3. git init, add, commit

4. github repo 생성

5. git push

dev 브랜치 생성

1. git switch -c dev

2. git push origin dev

 

github default 브랜치 변경

1. github settings

2. default branch를 dev로 변경

3. collaborator로 팀원 등록

 

팀원

Repository clone

리포지토리를 clone하여 개발소를 준비한다.

1. git clone "url" 을 진행 

기능 개발 진행

기능 개발은 feature 브랜치 생성하여 진행한다

1. git switch -c feat/signup -> feature 브랜치 생성

2. git push feat/signup -> github에 브랜치 등록

3. pull request를 진행한다.

4. reviewer 추가하면 리뷰어에게 email을 통해 알림이 전달된다. 

 

충돌 해결

1. github 내에서 충돌 처리를 할 수 있으나 권장하지 않는다.

2. git switch feat/signup - 개발 브랜치로 이동한다. 

3. git pull origin dev - dev에서 기능을 merge한다.

4. 테스트를 위해서 그렇다. github내에서는 테스트할 수가없다.

 

추가 기능 개발

feat 브랜치 개발이 하나 끝나면 다시 feat 작업을 진행한다.

1. git switch -c feat/profile

2. git add, commit, pull, push

3. pull request로 생성 및 리뷰

 

정리

 

1. dev 브랜치를 git clone 한다.

2. feat 브랜치를 생성한다.

3. push 하기 전에 pull한다.

4. push를 진행한다.

5. pull request를 진행한다. pull request가 있으면 연결된다.

6. dev->main으로 merge한다.

 

.gitignore

절대 올라가서는 안되는 데이터는 .gitignore에 등록한다. 비밀번호, 빌드 파일 등등

 

이슈사항

dev 로 이동후 git push하면 다음 메시지가 뜬다.

git push --set-upstream origin dev 을 하라고 한다. --set-upstream은 왜 뜨는지 알아본다.

스프링

이슈1. h2 데이터베이스 연결문제

문제점

다음 경로에 h2 데이터베이스를 생성하였다.

 jdbc:h2:~/jpashop

이후 application.yml을 다음과 같이 입력하였다.

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/jpashop:MVCC=TRUE
    username: sa
    password:
    driver-class-name: org.h2.Driver

  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        show_sql: true
        format_sql: true

logging:
  level:
    org.hibernate.SQL: debug

Spring을 실행하니 다음 예외가 발생한다.

org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database "/Users/sang-il/jpashop:MVCC=TRUE" not found, either pre-create it or allow remote database creation (not recommended in secure environments) [90149-224]

"/Users/sang-il/jpashop:MVCC=TRUE" not found 라는 구문을 보니 해당 경로를 찾지 못하는 듯하다.

강의를 다시 돌려 보니 ":MVCC"가 아닌 ";MVCC"였다. 이런 바보 같은.. 다시 수정하고 실행 해보았다.

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/jpashop;MVCC=TRUE
    username: sa
    password:
    driver-class-name: org.h2.Driver
    ...

 

잘 될거라 생각했는데 의외로 다음 메시지 뜬다.

org.h2.jdbc.JdbcSQLNonTransientConnectionException: Unsupported connection setting "MVCC" [90113-224]

MVCC가 지원되지 않는 setting이라고 나온다.

해결 방안

검색 시 다음 링크에서 답이 나왔다. H2 1.4.200 버전부터 MVCC 옵션이 삭제되었다고 나온다. 제거 후 실행하니 정상 동작한다.

3줄 요약

H2 1.4.200 이후 버전부터는 MVCC 옵션을 사용하지 않는다.

 

이슈2. Spring에서 Save, Find시 객체의 동등성

다음 코드는 성공한다. 왜 그럴까?

@Test
@Transactional
public void testMember() throws Exception {
    //given
    Member member = new Member();
    member.setUsername("memberA");
    //when
    Long savedId = memberRepository.save(member);
    Member findMember = memberRepository.find(savedId);

    //then
    assertThat(findMember).isEqualTo(member);
}

memberRepository: MemberRepository는 다음과 같이 구현되어 있다.

@Repository
public class MemberRepository {
    @PersistenceContext
    private EntityManager em;

    public Long save(Member member) {
        em.persist(member);
        return member.getId();
    }

    public Member find(Long id) {
        return em.find(Member.class, id);
    }
}

 

JPA 기본편을 수강하지 않았기 때문에 정확한 원리는 아직 모르는 상태이다. 다만 EntityManager에서 persist(member)를 진행하면 find 했을 때 Member객체를 "생성"하는 것이 아니라 "찾는" 행위를 한다. 마지 HashMap과 비슷하게 동작한다는 뜻이다.

 

TODO For Learn

EntityManager가 데이터를 저장하는 방식를 정리한다. 동작하는지 대략적으로 이해해야할 필요가 있다.

 

이슈3.  One-to-One, One-to-Many, Many-to-One, Many-to-Many

학습내용

다음과 같은 Database Table이 있을 때 JPA Entity는 다음과 같이 매핑된다.

데이터베이스 테이블 상으로는 MEMBER <- ORDER <- ORDER_ITEM 방향으로 참조하게 되며 역순으로는 연결된 것이 없다.

그러나 실제 어플리케이션으로 구현을 하면 Member는 Order의 리스트를 갖는 것이, Order는 OrderItem 리스트를 갖는 것이 비즈니스 로직을 구현하기에 편리하다. JPA는 데이터베이스의 연관 관계를 위와 같이 매핑해주는 역할을 하고 있다.

One-to-Many

Member->Order는 JPA 코드상으로는 다음과 같이 표현한다.

@Entity
@Table
@Getter @Setter
public class Member {
    @Id @GeneratedValue
    @Column(name = "member_id")
    private Long id;
	...
    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();
}

Member에서 Order는 리스트로 @OneToMany어노테이션을 사용하여 매핑되며, mappedBy="member"로 사용하는데 다른 곳에서 member field를 사용할 경우 자동으로 매핑이 된다.

Many-to-One

Order->Member는 JPA코드상 다음과 같이 표현한다.

@Entity
@Table
@Getter @Setter
public class Order {
    @Id
    @GeneratedValue
    @Column(name = "order_id")
    private Long id;
    ...
    @ManyToOne(fetch = LAZY)
    @JoinColumn(name = "member_id")
    private Member member;
}

Order에서 Member는 @ManyToOne을 사용하여 매핑되며, Member 테이블의 member_id를 키로 조인한다.

TODO For Learn

One-to-One, Many-to-Many에 대해 정리한다.

'스파르타_부트캠프 > TIL' 카테고리의 다른 글

240305 TIL  (0) 2024.03.05
240229 TIL  (0) 2024.02.29
240226~240303 TIL  (0) 2024.02.26
240219-240225 TIL  (0) 2024.02.18
240213-240218 TIL  (2) 2024.02.13