Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[20210501] Spring 실전 가이드, CORS 적용, 스프링부트, 리액트 배포(메이븐 빌드), JPA Entity 기본생성자 PROTECTED #113

Open
JuHyun419 opened this issue May 1, 2021 · 0 comments
Labels

Comments

@JuHyun419
Copy link
Owner

JuHyun419 commented May 1, 2021

Spring 실전 가이드(김남윤님 세미나)

  • 아키텍쳐: Layer VS Domain
  • Layer
    • 프로젝트에 이해가 낮아도 전체적인 구조를 빠르게 파악 가능
    • 빠르게 개발이 가능
    • 규모가 커질수록 레이어별 클래스 파일이 많아져서 코드 파악이 어려움
    • Layer 기준으로 분리했기 때문에 코드의 응집력이 떨어짐
  • Domain
    • 관련된 코드들이 응집해 있음
    • 디렉터리 구조를 통해 도메인을 이해할 수 있음
    • 도메인 지식 없이 이해하기 어려움
    • 각 계층의 구분에 대한 논의가 필요
  • 각 객체에 정확한 행위를 부여하고, 역할에 따라 분리하자!
    • MemberService -> MemberSearchService, MemberProfileService, MemberSignUpService 등등..
  • Lombok을 잘 사용하는 방법은 단 하나 => Lombok을 사용하지 않는 것..(코틀린)
  • 클래스 상단에 @builder는 지양하자
    • 이는 @AllArgsConstructor 효과가 발생함
    • ★ 비즈니스 로직에 맞게 필수 값에 대해서만 생성자를 열어두자.
  • 생성자위 @builder에 적절한 책임을 부여하자(Builder 여러 개 사용할 때)
@Builder(builderClassName = "~~", builderMethodName = "~~")
  • 본인의 역할, 책임, 행위를 풍부하게 표현해 주는 것이 중요하다고 생각함
  • 생성자 접근 지시자는 최소한으로 하자(PROTECTED 확인)
  • 엔티티 객체는 JPA에서 프록시 객체가 필요함으로 기본 생성자 접근지시자가 최소 PROTECTED 이다
  • lombok.config 설정을 통해 제한 하자.
  • lombok.data.flagUsage = error

본질은 ...

  • 마법(자동)으로 해주는 것들은 당장은 아니더라도 언젠가는 그 비용을 지불하게 되는 경우가 있음
  • 객체 생성은 매우 중요한 포인트이고, 최대한 비즈니스를 반영하고 안전하게 만들어야 함 !!
    • 생성자 최소한, 객체 생성 이후 데이터 검증, 유효성 검사, 필수 값만 받기 등등 방어적인 코드!!
    • Guava의 null 체크, Assert의 null 체크 메서드 등등

  • 안티 패턴
    • 꼬치꼬치 캐묻는다. 쿠폰이 만료되었는지, 이미 사용한 쿠폰인지 등등
  • 좋은 패턴
    • coupon.apply() 메서드를 통해 묻지말고 시킬 것
    • 이후 처리는 apply() 메서드에서 쿠폰 만료 & 이미 사용한 쿠폰 등등의 여부를 검증
  • 책임의 분류: 하는 것, 아는 것
  • 역할
    • 협력 내에서 다른 객체로 대체 할 수 있음을 나타냄
    • 대체 가능성을 의미함
    • 객체가 역할을 대체하기 위해서는 행동이 호환되어야 함
  • Service, ServiceImpl은 예전 스프링(Spring 3.x ?)에서는 사용할 수 밖에 없는 구조였다.(Dynamic Proxy 검색)

https://github.com/cheese10yun/spring-guide



CORS 적용

  • 어노테이션 적용 & WebMvcConfigurer 구현 클래스 적용
// 어노테이션 적용
@CrossOrigin(origins = "http://localhost:8080")
@RestController
public String hello() {
  ....
}

// WebMvcConfigurer 클래스 구현
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:1234");
    }
}

스프링부트, 리액트 빌드 & 배포(메이븐)

                        // pom.xml
			<!-- maven 실행 시 커맨드라인 실행으로 npm 및 관련 패키지를 자동으로 설치해주는 툴 -->
			<plugin>
				<groupId>com.github.eirslett</groupId>
				<artifactId>frontend-maven-plugin</artifactId>
				<version>1.9.1</version>
				<configuration>
					<!-- package.json 파일이 존재하는 디렉토리 지정 -->
					<workingDirectory>front</workingDirectory>
					<!-- node, npm이 설치될 디렉토리 -->
					<installDirectory>target</installDirectory>
				</configuration>
				<executions>
					<execution>
						<id>install node and npm</id>
						<goals>
							<goal>install-node-and-npm</goal>
						</goals>
						<configuration>
							<nodeVersion>v16.0.0</nodeVersion>
							<npmVersion>7.10.0</npmVersion>
						</configuration>
					</execution>
					<execution>
						<id>npm install</id>
						<goals>
							<goal>npm</goal>
						</goals>
						<configuration>
							<arguments>install</arguments>
						</configuration>
					</execution>
					<execution>
						<id>npm run build</id>
						<goals>
							<goal>npm</goal>
						</goals>
						<configuration>
							<arguments>run build</arguments>
						</configuration>
					</execution>
				</executions>
			</plugin>

JPA Entity 기본 생성자 접근 제어 - PROTECTED

@NoArgsConstructor(access = AccessLevel.PROTECTED)
  • JPA에서 객체를 생성할 때 프록시는 PROTECTED(상속) 까지 가능함
  • 따라서 외부에서 임의로 기본 생성자를 통해 객체를 생성하고 사용할 가능성이 있으므로 외부에서 생성 못하도록 막음
  • 숨겨야 할 부분은 숨기자 -> 방어적인 코딩
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant