eclipes4j's 개발은 언제나 즐겁다.

Ubuntu root full space 와 docker

Programming!

갑자기 나의 민트리눅스께서 "/"의 용량이 부족하다고 경고를 때리신다. ( 100% / )


이미지가 쌓였나..?하고 기존대로 "linux-image*"를 모두 지웠는데...

$ sudo dpkg -l "linux-image*"

$ sudo apt remove "linux-image-x.y.z" ( -headers 포함 )



참고로 Image 설정에서 이전 이미지는 가지고 있지 않도록 하자.




여튼 지웠으나.......................고작 6G가 확보. 어어...이게 뭐야?!



해서, 디렉토리 용량 리스트 뽑아보니 "/var/lib/docker : 73G" 우어어어어어어어.. 


얼릉 볼륨을 지워버림. 아~ 뭐든 자주 관리해줘야하는 구나..허허.

$ docker volume prune -f


https://forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604


https://docs.docker.com/engine/reference/commandline/image_prune/



Spring Boot 1.5 Security 적용

Programming!

신규 플젝에서 Spring Security 를 적용하면서 몇가지 트러블.


@EnableWebSecurity

@Configuration

public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override

    protected void configure(HttpSecurity httpSecurity) throws Exception {

        httpSecurity.authorizeRequests()

            .antMatchers("/", "/index", "/health").permitAll()

            .antMatchers("/{serviceRoleType}/**").access("@guard.validServiceRoleType(authentication,#serviceRoleType)")

            .antMatchers("/stay/**").authenticated()

            .antMatchers("/gormet/**").authenticated()

            .anyRequest().authenticated()

            .and()

            .formLogin()

            .usernameParameter("username")

            .passwordParameter("password")

            .loginPage("/login")

            .successHandler(successHandler)

            .failureHandler(failureHandler)

            .permitAll()

            .and()

            .logout()

            .permitAll();

        httpSecurity.csrf().disable().exceptionHandling().accessDeniedPage("/403");

...


1.

레퍼런스를 보고 위와 같이 configure 를 Override 해서 돌려보니 Login이 해제되는 현상이 있었다. 아오 뭐가 문제지...하면서 소스를 파고 들어가보니 httpSecurity 의 체인 형태가 좀... 즉 httpSecurity. 를 두번 지정하니 위의 것이 초기화된 문제였다. 아.. 해서 .and() 로 묶어서 해결.

(시파! 어느 사이트의 레퍼런스...)




    @Override

    public void configure(WebSecurity webSecurity) throws Exception {

        webSecurity.ignoring().antMatchers("/static/**", "/resources/**");

    }


2.

이 주소와 thymeleaf 와 <img src=" ... 주소처리. 아씨... 이것도 햇갈려서 죽는줄 알았네..




    @Override

    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

        auth.userDetailsService(userDetailsService).passwordEncoder(pelicanPasswordEncoder);

    }


3.

별도의 password 정책이 있다면 passwordEncoder 추가.


 

Multi DatabaseSource에 이어서 더..

Programming!

지난번에 이어서...


막상 기존 운영 서비스의 소스를 보니 데이터베이스 스키마가 하나가 더 있다. 아....


즉,  물리적 Database Server하나에 기존 서비스에서 사용되는 schema는 총 3개였던 것이다. 


"계정용DB, 파트너용DB, 고객운영용DB" 이렇게 3개.


파트너용 백오피스에서 예약 내역 조회는 가장 기본적인 비즈니스인데 파트너용DB와 고객운영용DB가 궂이 분리했고.. 거기서 테이블을 7-8개씩 조인을 한다. 아....



여튼 그래서 3개 모두 datasources를 따로 가져갈까 하다가 계정DB는 따로하는게 맞을 듯 해보이고 두개는 하나의 커넥션 내에서 하는게 맞을 듯 해서 datasource는 하나로 통합하기로 했다.


이때 조건이나 방법을 적어보면 아래와 같다.


- 두개의 schema를 모두 connection 이 가능한 계정이 있어야 한다.

- Datasource설정에 해당 스키마 entity와 repository가 놓일 package를 스캔하도록 한다.

- Entity에 schema또는 catalog를 지정해준다.


다음과 같다.


Auth DataSource : HikariCpSellerDataSource.java

@Configuration

@EnableTransactionManagement

@EnableJpaRepositories(basePackages = {

"xxx.pelican.repository.selleroffice"

"xxx.pelican.entity.selleroffice",

"xxx.pelican.repository.livedb",

"xxx.pelican.entity.livedb"})

public class HikariCpSellerDataSource {


    @Autowired

    private HikariConfig pelicanhikariConfig;

    

    

    @Bean

    @Primary

    @ConfigurationProperties(prefix = "spring.datasource")

    public DataSource sellerofficeDataSource() throws SQLException {

        HikariDataSource hikariDataSource = new HikariDataSource();

        return hikariDataSource;

    }

    

    @Primary

    @Bean(name = "entityManagerFactory")

    public LocalContainerEntityManagerFactoryBean sellerofficeEntityManagerFactory(EntityManagerFactoryBuilder builder@Qualifier("sellerofficeDataSource") DataSource dataSource) {

        return builder.dataSource(dataSource).packages(

"xxx.pelican.repository.selleroffice"

"xxx.pelican.entity.selleroffice"

"xxx.pelican.repository.livedb"

"xxx.pelican.entity.livedb"

).build();

    }


    @Primary

    @Bean(name = "transactionManager")

    public PlatformTransactionManager sellerofficeTransactionManager(@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {

        return new JpaTransactionManager(entityManagerFactory);

    }

}



Entity : Reservation.java - 고객운영용DB

@Data

@AllArgsConstructor

@NoArgsConstructor

@Builder

@Entity

@Table(catalog = "livedb", name = "reservation")

public class Reservation implements Serializable {

    @Id

    @GeneratedValue(strategy = GenerationType.AUTO)

    @Column(name = "idx", nullable = false, unique = true)

    private Long idx;


Entity : PartnerReservation.java - 파트너용DB

@Data

@AllArgsConstructor

@NoArgsConstructor

@Builder

@Entity

@Table(catalog = "selleroffce", name = "partner_reservation")

public class PartnerReservation implements Serializable {

    @Id

    @GeneratedValue(strategy = GenerationType.AUTO)

    @Column(name = "idx", nullable = false, unique = true)

    private Long idx;