vue 개발을 하다가 data의 값이 잘 바꼈는데

컴포넌트 rerendering이 잘안돼서 그대로 이상한 값이 남아 있는 경우가 있었다.

 

그래서 찾아보니 좋은 stackOverFlow를 발견..

강제로 rerendering을 시켜주고 싶었다!

 

https://stackoverflow.com/questions/32106155/can-you-force-vue-js-to-reload-re-render

 

Can you force Vue.js to reload/re-render?

Just a quick question. Can you force Vue.js to reload/recalculate everything? If so, how?

stackoverflow.com

 

 


이중에 어떤 방법을 할까하다가

 

처음엔 당연히

this.$forceUpdate()를 쓰려고 했지만 잘안돼서.. 그치만 다시 찬찬히 읽어보니 방법이 생각났지만

여기 나온 방식중에서 가장 Best way라고 나온  key를 이용하는 방식을 써서 해결하였다.

 

그럼 forceUpdate와 Key를 이용해서 강제 rerendering하는 것을 알아보자 

(https://michaelnthiessen.com/force-re-render/ 다음을 해석하였습니다. 잘쓰여져있네여)

 


1. forceUpdate();

이것은 vue에서 공식적으로 제공해주는 방식이다. (https://vuejs.org/v2/api/#vm-forceUpdate)

 

보통은 Vue에서 data의 변화를 감지하는데 이것을 보통 reactive 하다고 말합니다. 

그런데 아시다시피 Vue의 reactivity 시스템은 모든 변화를 감지하지 못합니다..(언제그러는지는 정확하게 모르겠으나 개발하다보면 왕왕 있습니다..)

 

그래서 변화를 감지하지 못할때 강제 리렌더링을 해줍니다.

 

forceUpdate를 하기위해서는두가지 방법이 있는데 , Global하게 forceUpdate 하는 것과component 단위로 forceUpdate 하는방법

 

단순하게 생각해도 Global한 방식은 잘안쓸거 같군요..

// Globally
import Vue from 'vue';
Vue.forceUpdate();

// Using the component instance
export default {
  methods: {
    methodThatForcesUpdate() {
      // ...
      this.$forceUpdate();  // Notice we have to use a $ here
      // ...
    }
  }
}

 

 

2. key 이용

 

key를 이용 하려면 Vue에서 제공하는 key에 대해서 알아야 하는데

 

Vue에서 key는 각 특정 component에 특정 값을 매핑해 두는데 이게 key라고 볼 수 있다.

그래서, key가 동일하면 component가 변하지 않지만

key가 변하면 Vue는 예전 component 를 지우고 새로운 component를 만듭니다.

 

 

<template>
   <component-to-re-render :key="componentKey" />
</template>

<script>
 export default {
  data() {
    return {
      componentKey: 0,
    };
  },
  methods: {
    forceRerender() {
      this.componentKey += 1;  
    }
  }
 }
</script>

그래서 다음과같이 자식 component에 key를 props로 내려주고

forceRerender라는 method에 key값을 변경해주도록 해주면

 

강제 Rerendering이 필요할때 forceRerender() method를 호출해주면

Vue에서 이전 component 를 지우고 새 component를 그려줍니다.

 

저도 이방법으로 쓰레기값이 남아있는 문제를 해결하였습니다!

 

굳굳!

 

 

 

1. SQLExcpetion

JDBC는 모든 Exception을 SQLException 에 하나에 모두 담아버린다. 대부분의 SQLException은 복구가 불가능하다. DAO 밖에서 SQLException을 다룰 수 있는 가능성은 거의 없다. 따라서 필요도 없는 기계적인 throws 선언이 등장하도록 방치하지 말고 가능한 한 빨리 언체크/런타임 예외로 전환해줘야 한다.

 

2. DataAccessException

런타임 예외이고 DataAccessException 중 가장 루트 class이다.

JdbcTemplate 템플릿과 콜백 안에서 발생하는 모든 SQLException을 런타임 예외인 DataAccessException으로 포장해서 던져준다.

Spring에서 DB 관련 Exception 은 DataAccessException 으로 한번 감싸줘서 알려준다고 보면 된다.

DBMS에 따라서 에러코드가 다를텐데 그래도 코드는 스프링에서 일관적으로 보여주니 일관성이 있어서 좋을 것이다. 

 

  • dbcTemplate은 SQLException을 단지 런타임 예외인 DataAccessException으로 포장하는 것이 아니라 DB의 에러 코드를 DataAccessException 계층구조의 클래스 중 하나로 매핑해준다.JdbcTemplate에서 던지는 예외는 모두 DataAccessException의 서브클래스 타입이다.
  • 드라이버나 DB 메타정보를 참고해서 DB 종류를 확인하고 DB별로 미리 준비된 매핑정보를 참고해서 적절한 예외 클래스를 선택하기 때문에 DB가 달라져도 같은 종류의 에러라면 동일한 예외를 받을 수 있는 것이다.

 

주의할점은, 

키값 중복이 되는 같은 상황이라도 똑같은 예외 발생하지 않을 수 있다.

  • 데이터 액세스 기술에 상관없이 키 값이 중복이 되는 상황에 아래와 같이 동일한 예외가 발생하지 않는다.
  • JDBC는 DuplicateKeyException, 하이버네이트는 ContraintViolationException을 발생시킬 것이다.

 

3. 결론

결론적으로, 스프링이 잘 정립한 DataAccessException을 활용하는 것이 바람직 하지만, 특정기술에 따라 예상하지 못한 결과가 나올수 있다. 

아직 모든 예외가 명확하게 추상화되어있지 않다. 

이런 경우 로직에서 적절한 DataAccessException의 하위 클래스로 전환하는 방법 등을 사용해서 최대한 일관된 예외 전략을 가져가는 것이 좋을 것 같다.

스프링은 DataAccessException을 통해 DB에 독립적으로 적용 가능한 추상화된 런타임 예외계층을 제공한다.

DAO를 데이터 액세스 기술에서 독립시키려면 인터페이스 도입과 런타임 예외 전환, 기술에 독립적인 추상화된 예외로 전환이 필요하다.

 


참고)

https://gunju-ko.github.io/toby-spring/2018/11/07/%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC.html

https://velog.io/@kyle/%ED%86%A0%EB%B9%84-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC

https://withseungryu.tistory.com/95

https://namocom.tistory.com/913

업무하면서 예외처리에 대해서 고민할 일이 있었다

 

정리해보자

 

보통 예외처리는 공통으로 처리하는게 많다

그 공통을 어떻게 처리할까?

 


 

1. @ExceptionHandler 

- Controller 에서 일어나는 예외를 잡아서 한번에 처리해 줌

- controller, RestController에서 사용 가능

- 리턴타입 , parameter 타입 자유 

- 아래 예시처럼 여러개 Exception class 를 여러개 나열 가능 

 

@RestController
public class TestController{

	@ExceptionHandler(NullPointerException.class)
    public Object nullex(Exception e){
    	System.err.println(e.getClass());
        return;
    }
    
     @ExceptionHandler({JdbcSQLException.class, BadSqlGrammarException.class, MyBatisSystemException.class})
    public ResponseEntity<customedException> handleJdbcSqlException(Exception exception) {
        return customedException(exception);
    }
}

 

 

2. @RestControllerAdvice

- 전역으로 예외처리 관리 해주는 어노테이션이다

@RestControllerAdvice
public class GlovalExceptionTest{
	@ExceptionHandler(NullPointer.class)
    public ResponseEntity<CustomException> handleNullpointerException(Exception e){
    	return new CustomException(e);
	}
}

 

 

- @RestControllerAdvice = @ControllerAdvice + @ResponseBody

=> 즉, @ControllerAdvice 와 같은 역할인데 @ResponseBody가 추가돼서 , 객체도 리턴이 가능한 것이다.

 예외처리 페이지로 리다이렉트만 할것이면 @ControllerAdvice만 써도되고 , 

API 서버라서 객체를 리턴해야 한다면 @ResponseBody 어노테이션이 추가된 @RestControllerAdvice 를 사용하면 된다.

 

보통은 backend와 frontend를 따로 띄워서 하는게 대부분이기 때문에 (MSA..)

@RestControllerAdvice를 쓰면 될거같다 객체로 리턴!!

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@ControllerAdvice
@ResponseBody
public @interface RestControllerAdvice {
    @AliasFor(
        annotation = ControllerAdvice.class
    )
    String[] value() default {};

    @AliasFor(
        annotation = ControllerAdvice.class
    )
    String[] basePackages() default {};

    @AliasFor(
        annotation = ControllerAdvice.class
    )
    Class<?>[] basePackageClasses() default {};

    @AliasFor(
        annotation = ControllerAdvice.class
    )
    Class<?>[] assignableTypes() default {};

    @AliasFor(
        annotation = ControllerAdvice.class
    )
    Class<? extends Annotation>[] annotations() default {};
}

 

 


참고

https://jeong-pro.tistory.com/195

프로젝트를 하면서 

ddl과 insert query가 필요했다

현재 쓰는 툴로는 postgresql이 쿼리가 뽑히지 않아서

pg_dump를 이용해 쿼리를 뽑아ㅏㅆ다.

 

내가사용한건 다음과 같이 두 명령어

 

 

-- ddl

./pg_dump -Cs apim -n schemaname e -n pubic -E utf-8 > ddl_schema.sql

 

-- insert query

./pg_dump -a -O --inserts -E UTF8 dbname > dump.sql

 

 

참고)

schema 단위 백업

./pg_dump -Cs dbname -n schemaname -n schemaname2 -E utf-8 > ddl_schema.sql

./pg_dump -a dbname -n schemaname -n schemaname2 -E utf-8 > data_schema.sql

 

table 단위 백업

./pg_dump -Cs dbname -t schema.table -E utf-8 > ddl_table.sql

./pg_dump -a dbname -t schema.table -E utf-8 > data_table.sql

 


참고

 https://stricky.tistory.com/169

 

[gpdb 백업] pg_dump & pg_restore 간단 사용법

[gpdb 백업] pg_dump & pg_restore 간단 사용법 안녕하세요. GPDB 에서 PG_DUMP 와 PG_RESTORE를 이용한 백업과 복구에 관해서 간략하게 안내해 드릴께요. pg_dump & pg_restore는 sql 기반으로 gpdb안의 데이터..

stricky.tistory.com

       

'DEVELOP > DB' 카테고리의 다른 글

[DB] postgreSql Centos7에 설치 및 설정하기  (0) 2020.08.24
[DB]Isolation Level 알아보기  (0) 2020.07.19
[mySql] 계정 생성 및 권한 설정  (0) 2020.05.25
[MariaDB] general log 설정하기  (0) 2020.05.25
DB (mysql) 설정 변경  (0) 2020.03.13

소수는 1과 나 자신으로만 나누어지는 수이다.

 

소수를 판별하는 알고리즘 중에서 에라토스테네스의 체가 가장 빠르다. ( 시간 복잡도 O(Nlog(logN)) )

 

에라토스테네스의 체는 가장 먼저 소수를 판별할 범위만큼 배열을 할당하여, 해당하는 값을 넣어주고, 이후에 하나씩 지워나가는 방법을 이용한다.

  1. 배열을 생성하여 초기화한다.
  2. 2부터 시작해서 특정 수의 배수에 해당하는 수를 모두 지운다.(지울 때 자기자신은 지우지 않고, 이미 지워진 수는 건너뛴다.)
  3. 2부터 시작하여 남아있는 수를 모두 출력한다.

여기서 한단계 더 발전시켜서 i*i까지 체크해준다. 

// i*i 부터 시작하는 이유는? 그이전 값은 그이전 i값에서 다 소수인지 체크 했으므로
// 3*3 = 9 부터 +3 씩 체크해주면된다, 2의배수는 2에서 모두 체크했음 5 5에서 체크할 예정

 

static boolean[] prime = new boolean[1000001];
static void findPrime(){
        // 100만 이하 소수 찾기 prime[i] == false 소수
        for (int i = 2; i * i <= 1000000; i++) {
         // i*i 부터 시작하는 이유는? 그이전 값은 그이전 i값에서 다 소수인지 체크 했으므로
 		// 3*3 = 9 부터 +3 씩 체크해주면된다, 2의배수는 2에서 모두 체크했음 5는 5에서 체크할 예정
            if (!prime[i]) {
                for (int j = i * i; j <= 1000000; j += i) {
                    prime[j] = true;
                }
            }
        } 
}

 

+ Recent posts